/Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Data Acquisition System---Eurogam Project )show 18 774 moveto ( _____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Acquisition Module: Frontend Control Aspects )show 18 750 moveto ( ____________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Monday 19 March 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This paper discusses some of the design issues in the Acquisition Module \(AM\))show 18 654 moveto ( component of the Eurogam software architecture. The AM is seen as a focal)show 18 642 moveto ( point for all requests for control and monitoring of an experiment coming from)show 18 630 moveto ( user interface programs. In particular, the AM provides functions for)show 18 618 moveto ( accessing programmable registers in the frontend hardware. The latter includes)show 18 606 moveto ( the VXI crates housing the GE and BGO boards, the trigger system, the readout)show 18 594 moveto ( and eventbuilding system, detector power supplies, and any other frontend)show 18 582 moveto ( hardware intimately related with data acquisition. )show 18 570 moveto ()show 18 558 moveto ()show 18 546 moveto ( Frontend register model )show 18 546 moveto ( _______________________ )show 18 534 moveto ()show 18 522 moveto ( To give some specific examples, here is a list of the controllable parameters)show 18 510 moveto ( on the GE VXI boards, as currently envisaged. No doubt the BGO boards will be)show 18 498 moveto ( similar. )show 18 486 moveto ( )show 18 474 moveto ( Pole zero adjustment 8 bit DAC 1 per channel )show 18 462 moveto ( CFD threshold 8 bit DAC 1 per channel )show 18 450 moveto ( CFD Output delay 8 bit DAC 1 per channel )show 18 438 moveto ( CFD width adjust 8 bit DAC 1 per module )show 18 426 moveto ( Test generator 16 bit DAC 1 per module )show 18 414 moveto ( ADC low window 16 bit reg 3 per channel )show 18 402 moveto ( ADC high window 16 bit reg 3 per channel )show 18 390 moveto ( Channel inhibit Full word per channel )show 18 378 moveto ( Channel enable Full word per channel )show 18 366 moveto ( Test enable Full word per module \(orchannel?\) )show 18 354 moveto ( Test disable Full word per module \(orchannel?\) )show 18 342 moveto ( ADC Identifier 3 per channel )show 18 330 moveto ( Local trigger parameters not yet defined )show 18 318 moveto ()show 18 306 moveto ( Register naming It's generally agreed that these registers should be given)show 18 306 moveto ( ________________ )show 18 294 moveto ( logical names much like program variables and the interface presented in terms)show 18 282 moveto ( of loading values from and storing values into these 'variables'. The names)show 18 270 moveto ( reflect logical distinctions rather than physical ones since the names will)show 18 258 moveto ( appear in the user interface. Hence we have )show 18 246 moveto ( )show 18 234 moveto ( G23.PoleZero )show 18 222 moveto ( G7.ADC2.LowWindow )show 18 210 moveto ()show 18 198 moveto ( for the pole zero adjustment on GE channel 23 and the low window on the second)show 18 186 moveto ( ADC on GE channel 7, respectively. Where a single register on a board covers)show 18 174 moveto ( several channels \(eg the CFD width adjust\) there is no harm in pretending that)show 18 162 moveto ( it is replicated per channel if this makes for a simpler user interface. We)show 18 150 moveto ( just have n aliases for a single physical register. )show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Access functions Three functions are provided for operating on individual)show 18 774 moveto ( ________________ )show 18 762 moveto ( registers: )show 18 750 moveto ( )show 18 738 moveto ( InitialiseReg == [reg?:Register; status!:Report] )show 18 726 moveto ( ReadReg == [reg?:Register; val!:Value; status!:Report] )show 18 714 moveto ( WriteReg == [reg?:Register; val?:Value; status!:Report] )show 18 702 moveto ()show 18 690 moveto ( and three functions for operating on sets of registers defined by pattern)show 18 678 moveto ( matching on their names: )show 18 666 moveto ( )show 18 654 moveto ( InitialiseReg* == [pat?:Pattern; status!:Report] )show 18 642 moveto ( ReadReg* == [pat?:Pattern; rvlist!: seq \(Register,Value\); status!:Report] )show 18 630 moveto ( WriteReg* == [pat?:Pattern; val?:Value; status!:Report] )show 18 618 moveto ()show 18 606 moveto ( The Initialise and Initialise* functions write a default, safe value into one)show 18 594 moveto ( or more registers. )show 18 582 moveto ()show 18 570 moveto ( The pattern arguments of the * functions need not be very sophisticated: the)show 18 558 moveto ( full power of general regular expressions is probably over the top. Simple)show 18 546 moveto ( wildcarding of fields and provision of numeric ranges is probably adequate.)show 18 534 moveto ( For example, the following two patterns )show 18 522 moveto ( )show 18 510 moveto ( G*.PoleZero )show 18 498 moveto ( G[30-39].ADC*.LowWindow )show 18 486 moveto ()show 18 474 moveto ( might match all GE pole zero registers and all the ADC low window registers on)show 18 462 moveto ( GE channels 30 to 39 respectively. )show 18 450 moveto ()show 18 438 moveto ( The ReadReg* function takes a pattern and returns a sequence \(list\) consisting)show 18 426 moveto ( of pairs of register names and the corresponding values. )show 18 414 moveto ()show 18 402 moveto ( The WriteReg* function takes a pattern and a single value and writes the value)show 18 390 moveto ( to all registers matching the pattern. )show 18 378 moveto ()show 18 366 moveto ( Register types 32 bit unsigned integer \(I32\) and single precision reals)show 18 366 moveto ( ______________ )show 18 354 moveto ( \(R32\) [and variable length character string \(C*\)] types are supported. Some)show 18 342 moveto ( registers will almost certainly be narrower than 32 bits so truncation may)show 18 330 moveto ( occur on write operations. This is detected and reported as an error. On read)show 18 318 moveto ( operations the value is padded with high order zero bits. )show 18 306 moveto ()show 18 294 moveto ( The register consistency problem Frontend system registers can be divided)show 18 294 moveto ( ________________________________ )show 18 282 moveto ( into two classes: those that can take arbitrary values without compromising)show 18 270 moveto ( system functions, and those whose values must be assigned consistently with)show 18 258 moveto ( the values in other registers. For example, the GE channel CFD thresholds)show 18 246 moveto ( probably fall in the former class: users can set them arbitrarily with the)show 18 234 moveto ( result that individual channels may cease to work properly, but the integrity)show 18 222 moveto ( of data on other channels is preserved. For examples of the latter class in)show 18 210 moveto ( the present system, consider the EM ADC status registers and the MMC memory)show 18 198 moveto ( locations determining the base addresses of singles histograms. Enabling the)show 18 186 moveto ( ADC status bit controlling singles histogramming on a channel without first)show 18 174 moveto ( allocating histogram memory and initialising the corresponding base address)show 18 162 moveto ( can result in corruption of other singles histograms. In the present system)show 18 150 moveto ( this difficulty is circumvented by preventing direct access to individual)show 18 138 moveto ( registers. Instead, functions such as )show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( )show 18 762 moveto ( CreateSinglesHistogram == [channel?:EMchannel; range?:Int; ...; status!:Report] )show 18 750 moveto ()show 18 738 moveto ( are provided which ensure that frontend registers change state in)show 18 726 moveto ( self-consistent steps. In practice, these functions merely update a model of)show 18 714 moveto ( the frontend registers, and just one function, )show 18 702 moveto ( )show 18 690 moveto ( Go == [status!:Report] )show 18 678 moveto ()show 18 666 moveto ( maps the model onto the actual registers with special attention paid to the)show 18 654 moveto ( order in which critical 'enabling' registers such as the EM ADC status)show 18 642 moveto ( registers are written. A side effect of this design is that no critical)show 18 630 moveto ( registers \(in fact no registers at all\) can be written while data is being)show 18 618 moveto ( acquired. )show 18 606 moveto ()show 18 594 moveto ( However, while debugging hardware and software the ability to read and write)show 18 582 moveto ( *all* frontend registers is extremely valuable to the expert user. Registers)show 18 570 moveto ( of the second kind are therefore subject to optional protection against)show 18 558 moveto ( accidental damage by direct manipulation by the naive user. The function )show 18 546 moveto ( )show 18 534 moveto ( RegisterProtection [onoroff?:Bool; status!:Report] )show 18 522 moveto ()show 18 510 moveto ( turns protection on and off. This is analogous to the CLEARPROTECT boolean JCL)show 18 498 moveto ( variable in the present system which controls protection against accidental)show 18 486 moveto ( zeroing of online histograms \(though it's actually in the interactive user)show 18 474 moveto ( interface, not the data collection module\). Registers of the second kind may)show 18 462 moveto ( not be written at all while data is being acquired. )show 18 450 moveto ()show 18 438 moveto ( [Query: should we distinguish a third set of registers which should be write)show 18 426 moveto ( protected when data taking is active? is the second set a subset of the)show 18 414 moveto ( third?] )show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ( Frontend configuration file )show 18 378 moveto ( ___________________________ )show 18 366 moveto ()show 18 354 moveto ( The configuration of each frontend system is described in its own file,)show 18 342 moveto ( modelled on the DSFILE used for the EM/1 and EC based frontends. The file is)show 18 330 moveto ( completely hardware oriented, telling what modules are present at what)show 18 318 moveto ( addresses in what crates, and so on. It also has to provide enough information)show 18 306 moveto ( so that the abstract register model outlined above can be mapped onto physical)show 18 294 moveto ( hardware. In practice, the presence of hardware modules and boards determines)show 18 282 moveto ( which abstract registers exist in any one configuration. )show 18 270 moveto ()show 18 258 moveto ( The configuration file has a simple syntax of statements \(possibly continued)show 18 246 moveto ( over several lines\) made up of keyword/value pairs. This is somewhat verbose)show 18 234 moveto ( but readable. In general each statement represents a simple or composite)show 18 222 moveto ( hardware entity such as a crate, board, or module. The present DSFILE format)show 18 210 moveto ( has a separate statement per EM channel and makes for rather large repetitive)show 18 198 moveto ( files. Most of these statements are redundant because the information can be)show 18 186 moveto ( deduced from knowledge of individual ADC module types and their internal)show 18 174 moveto ( structures which can be embedded in code. Board structures are relatively)show 18 162 moveto ( static---only their number and positions change with any frequency. )show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Here is a caricature of a configuration file to give a flavour of the syntax)show 18 762 moveto ( and the kind of information presented. )show 18 750 moveto ( )show 18 738 moveto ( STATION EG1 # names the frontend being defined )show 18 726 moveto ( CRATE VX1 TYPE VXI ETHERADDR @123456789ABC IPADDR 12.34.56.78 ... )show 18 714 moveto ( # plus details of VXI resource manager processor )show 18 702 moveto ( BOARD GE1 TYPE GE SLOT 5 CHANNELS 1--5 ... # for a GE board )show 18 690 moveto ( : )show 18 678 moveto ( BOARD BG1 TYPE BG SLOT 8 CHANNELS 1a--1j,2a--2j,3a--3j ... # for a BG board )show 18 666 moveto ( : )show 18 654 moveto ( CRATE VM1 TYPE VME ETHERADDR @123456789ABD IPADDR 12.34.56.79 ... )show 18 642 moveto ( MODULE CBD1 TYPE CBD8210 VMEADDR @40000 ... # for a CAMAC branch driver )show 18 630 moveto ( : )show 18 618 moveto ( CRATE CAM1 TYPE CAMAC BRANCH 5 CRATE 1 VIA CBD1 ... )show 18 606 moveto ( # CAMAC crate accessed via VME branch driver CBD1 )show 18 594 moveto ( MODULE RS1 TYPE RS232 SLOT 12 )show 18 582 moveto ( # a hypothetical 4 way RS232 port module in CAMAC crate CAM1 )show 18 570 moveto ( : )show 18 558 moveto ( CRATE HV1 TYPE LC1449 # LeCroy high voltage mainframe )show 18 546 moveto ( MODULE HVC1 TYPE LC1444N SLOT 4 CHANNELS 1--8 ... )show 18 534 moveto ( # high voltage card powering detectors on channels 1--8 )show 18 522 moveto ( : )show 18 510 moveto ( MODULE HVSC1 TYPE LC1445 SLOT 17 VIA RS1.1 )show 18 498 moveto ( # high voltage system controller on port 1 of RS1 )show 18 486 moveto ( : )show 18 474 moveto ( : )show 18 462 moveto ()show 18 450 moveto ( Note that the 'module-M-is-in-crate-C' relationship is expressed by the)show 18 438 moveto ( ordering of statements, and access paths to modules are defined implicitly by)show 18 426 moveto ( chains of 'VIA' keywords. For example, the high voltage system controller)show 18 414 moveto ( HVSC1 is accessed via port 1 on the async port module RS1 in slot 12 of crate)show 18 402 moveto ( 1 on the CAMAC branch emanating from the CBD8210 driver at address @40000 in)show 18 390 moveto ( VME crate VM1 whose control processor listens for control function requests on)show 18 378 moveto ( IP address 12.34.56.79 at some fixed, built in port number. [Whew!] )show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ( Acquisition module implementation )show 18 342 moveto ( _________________________________ )show 18 330 moveto ()show 18 318 moveto ( The AM is a distributed software module with a master component running in a)show 18 306 moveto ( general purpose system and slave components running in individual control)show 18 294 moveto ( processors in frontend crates. I expect these slaves to be \(clusters of\) OS-9)show 18 282 moveto ( processes. Application programs communicate with the master component which)show 18 270 moveto ( distributes requests to its slaves by an RPC protocol. For front-end control)show 18 258 moveto ( purposes the master--slave dialogue is at the level of abstract register)show 18 246 moveto ( names. The frontend slave components are responsible for mapping abstract)show 18 234 moveto ( register names onto physical addresses, which they do by reference to the)show 18 222 moveto ( contents of the appropriate frontend configuration file and built in methods)show 18 210 moveto ( associated with known board and module types. In addition to physical address)show 18 198 moveto ( slaves need to deduce register type and protection information for each)show 18 186 moveto ( abstract register. )show 18 174 moveto ()show 18 162 moveto ( To avoid duplicating the configuration file on multiple frontend crates the)show 18 150 moveto ( master component reads it once when the frontend system is claimed for an)show 18 138 moveto ( experiment and distributes it to its slaves \(which it locates by reference to)show 18 126 moveto ()show 18 114 moveto ( 4)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( the configuration file itself\). )show 18 762 moveto ()show 18 750 moveto ( The principal design issue is how to arrange for the master to direct)show 18 738 moveto ( functions on abstract registers to the appropriate slaves, given that it's not)show 18 726 moveto ( desirable for the master to know enough about board and module structures to)show 18 714 moveto ( derive the mapping from logical to physical space itself. [Is this system)show 18 702 moveto ( distributed or is this system distributed?] Three solutions present)show 18 690 moveto ( themselves: )show 18 678 moveto ()show 18 666 moveto ( o broadcast all functions to all slaves always. )show 18 654 moveto ( o broadcast all functions to all slaves initially, but note who replies)show 18 642 moveto ( affirmatively and cache their addresses for future use. )show 18 630 moveto ( o explicitly inquire of the slaves which logical addresses they support at)show 18 618 moveto ( frontend claim time. )show 18 606 moveto ()show 18 594 moveto ( [Query: which is best? any further possibilities?] )show 18 582 moveto ()show 18 570 moveto ( A secondary issue involves registers such as those driving DACs in the)show 18 558 moveto ( frontend hardware which may be accessed as type R32 \(in some meaningful)show 18 546 moveto ( physical units\) though they are physically narrow integers, typically I8. Some)show 18 534 moveto ( calibration function\(s\) need to be provided to transform between integer and)show 18 522 moveto ( real representations. This may occur in any of the following ways \(in order of)show 18 510 moveto ( increasing precedence\): )show 18 498 moveto ()show 18 486 moveto ( o fixed permanently into the code monitoring the registers, )show 18 474 moveto ( o expression-valued parameters defined in the hardware configuration file, )show 18 462 moveto ( o expression-valued pseudo registers, )show 18 450 moveto ()show 18 438 moveto ( depending on the frequency at which the calibration changes. For example, an)show 18 426 moveto ( expression representing a write calibration function for the CFD threshold for)show 18 414 moveto ( channel G23 may be held in the character string valued pseudo register )show 18 402 moveto ( )show 18 390 moveto ( G23.CFDThreshold.WriteCalibration )show 18 378 moveto ()show 18 366 moveto ( Its value might be the C language arithmetic expression )show 18 354 moveto ( )show 18 342 moveto ( \(x<=100.0\) ? -1.7+0.19*x : -5.0+0.21*x )show 18 330 moveto ()show 18 318 moveto ( where x is expected to be given in \(say\) milliVolts. )show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ( Persistence of the frontend setup )show 18 282 moveto ( _________________________________ )show 18 270 moveto ()show 18 258 moveto ( Application program\(s\) provide two essential user interface commands: )show 18 246 moveto ( )show 18 234 moveto ( SaveSetup == [file!:RegisterValueDataBase; status!:Report] )show 18 222 moveto ( RestoreSetup == [file?:RegisterValueDataBase; status!:Report] )show 18 210 moveto ()show 18 198 moveto ( which respectively write and read an ascii file of register values, analogous)show 18 186 moveto ( to the present XDBVARIABLES and XDBRESTORE commands for experiment variables.)show 18 174 moveto ( These are easily implemented on top of the ReadReg* and WriteReg functions)show 18 162 moveto ( provided by the acquisition module. )show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 5)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( [Query: should these functions save and restore the critical 'enabling')show 18 762 moveto ( registers? If so, RestoreSetup could cause data acquisition to resume)show 18 750 moveto ( immediately. Again, should they save and restore the registers controlling)show 18 738 moveto ( singles histogramming? If so, RestoreSetup could result in the creation of)show 18 726 moveto ( singles histograms with undefined counts, and the function would have to be)show 18 714 moveto ( integrated with the code supporting singles histogram access.] )show 18 702 moveto ()show 18 690 moveto ( Since all register writes pass through the acquisition module and this is)show 18 678 moveto ( assumed to be running, at least in part, on a general purpose machine, it is)show 18 666 moveto ( feasible to have all frontend registers 'shadowed' by a cache in the)show 18 654 moveto ( acquisition module. In the event, say, of a power cycle in a frontend crate)show 18 642 moveto ( caused by a clumsy experimenter, all current register settings can rapidly be)show 18 630 moveto ( recovered by invoking a )show 18 618 moveto ( )show 18 606 moveto ( ResetSetup == [status!:Report] )show 18 594 moveto ()show 18 582 moveto ( function which restores all register values from the cache. [Query: is this)show 18 570 moveto ( necessary? useful? I'm not convinced.] )show 18 558 moveto ()show 18 546 moveto ()show 18 534 moveto ( Access control and authentication )show 18 534 moveto ( _________________________________ )show 18 522 moveto ()show 18 510 moveto ( In the present DA system access to frontend systems is controlled by)show 18 498 moveto ( protecting the communications paths to the processors to which the EMs are)show 18 486 moveto ( connected. These paths are treated as exclusive system resources and are not)show 18 474 moveto ( directly accessible to users. In a more 'open' environment based on Ethernet)show 18 462 moveto ( communications achieving a reasonable guarantee of freedom from interference)show 18 450 moveto ( between experiments may not be so easy, especially if control paths are built)show 18 438 moveto ( over connectionless communications protocols. I have some ideas on how this)show 18 426 moveto ( can be done, based on concepts stolen from the Helios operating system, and)show 18 414 moveto ( will make this the subject of another paper. Note that access control is)show 18 402 moveto ( required for resources such as EbyE processors and data storage subsystems, as)show 18 390 moveto ( well as frontends. )show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 6)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Eurogam Data Acquisition Software Overview )show 18 750 moveto ( __________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Friday 20 April 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This paper presents an overview of how we envisage the EG software)show 18 654 moveto ( architecture. Because of the distributed nature of the system we have adopted)show 18 642 moveto ( the 'client-server' model---users make things happen by invoking application)show 18 630 moveto ( programs \(the clients\) which make requests on server programs that carry them)show 18 618 moveto ( out. Server programs are typically embedded in the data acquisition hardware)show 18 606 moveto ( and control it directly. Client programs run in workstations or multi-user)show 18 594 moveto ( systems and typically offer a graphical user interface. Communication between)show 18 582 moveto ( clients and servers is by a remote procedure call protocol over a local area)show 18 570 moveto ( network. )show 18 558 moveto ()show 18 546 moveto ( Server programs have an important 'information-hiding' role. Requests from)show 18 534 moveto ( client programs to servers are presented in terms of abstractions such as)show 18 522 moveto ( 'spectrum' and 'channel' rather than in specific hardware terms. The server)show 18 510 moveto ( programs elaborate these abstract functions into sequences of operations)show 18 498 moveto ( appropriate to the hardware in which they are embedded. )show 18 486 moveto ()show 18 474 moveto ( Server programs are also responsible for maintaining all of the 'state' of an)show 18 462 moveto ( experiment---what spectra exist, what EbyE files are open, what acquisition)show 18 450 moveto ( channels are enabled, and so on. By removing state from the client side we can)show 18 438 moveto ( allow several clients \(ie, user interfaces\) access to a single experiment. All)show 18 426 moveto ( information about the experiment needed by a client is obtained from the)show 18 414 moveto ( appropriate server program\(s\) by means of an Inquiry function. )show 18 402 moveto ()show 18 390 moveto ( In many cases, server programs will be non-trivial pieces of software, quite)show 18 378 moveto ( possibly further broken down into multiple subprocesses, and they must run in)show 18 366 moveto ( an environment providing a standard inter process communication mechanism for)show 18 354 moveto ( connecting to remote clients and other servers. Furthermore, in order to)show 18 342 moveto ( perform diagnostics on hardware in the field \(ie, not on the maintenance)show 18 330 moveto ( bench\) it will be necessary to displace server programs and run stand alone)show 18 318 moveto ( test programs. Finally, this environment must offer acceptable program)show 18 306 moveto ( development facilities. For these reasons we require all server programs to be)show 18 294 moveto ( supported by a suitable multi-tasking operating system. In particular, we)show 18 282 moveto ( require all VXI and VME crates comprising the data acquisition, readout, and)show 18 270 moveto ( event processing subsystems to be provided with a control processor running)show 18 258 moveto ( the OS-9 operating system. It is this processor which provides the environment)show 18 246 moveto ( for the server program\(s\) needed in the crate. )show 18 234 moveto ()show 18 222 moveto ( Any distributed system must address the related problems of access control and)show 18 210 moveto ( client authentication. A general solution is the concept of a 'capability'.)show 18 198 moveto ( Before it can access a resource such as a frontend crate or a tape drive a)show 18 186 moveto ( client program must first obtain a capability for the resource from the server)show 18 174 moveto ( program that guards it. The capability is a 32 or 64 bit piece of data)show 18 162 moveto ( obtained by encrypting the server's own internal identification for the)show 18 150 moveto ( resource with a randomly chosen key. This makes it unlikely that capabilities)show 18 138 moveto ( for distinct resources can be confused or successfully forged. Subsequent)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( requests from the client to access the resource must be accompanied by a copy)show 18 762 moveto ( of the capability, else the server refuses to grant access. When a resource is)show 18 750 moveto ( finally freed by a client the server invalidates the current capability by)show 18 738 moveto ( changing the encryption key associated with the resource, thus rendering all)show 18 726 moveto ( copies of the current capability 'stale'. Each of the servers outlined below)show 18 714 moveto ( supports a pair of ClaimResource and FreeResource functions whereby)show 18 702 moveto ( capabilities are dispensed and revoked. Once in possession of a capability a)show 18 690 moveto ( client has full access rights over the resource. Capabilities may be stored in)show 18 678 moveto ( files and may be passed if desired between distinct clients so that a resource)show 18 666 moveto ( claimed by one client may also be accessed by another. This provides the basis)show 18 654 moveto ( for several users to access the resources of a single experiment \(and)show 18 642 moveto ( potentially interfere with one another!\) )show 18 630 moveto ()show 18 618 moveto ( The remainder of this paper outlines the functions offered by each of the)show 18 606 moveto ( principal server types. The notation used is derived from the 'Z')show 18 594 moveto ( specification language. We give just the 'signature' of each function, namely)show 18 582 moveto ( its arguments and their data types. By convention, input and output argument)show 18 570 moveto ( names end in '?' and '!' respectively. To keep the descriptions short we have)show 18 558 moveto ( omitted further details of argument data types, hoping these are self-evident.)show 18 546 moveto ( We have also left out the capability arguments \(which are always required\). )show 18 534 moveto ()show 18 522 moveto ()show 18 510 moveto ( Frontend Crate Servers )show 18 510 moveto ( ______________________ )show 18 498 moveto ()show 18 486 moveto ( These include servers for crates containing GE cards, BG cards, histogrammers,)show 18 474 moveto ( trigger processor, event builder, and interfaces to apparatus control systems.)show 18 462 moveto ()show 18 450 moveto ( These servers offer a uniform client interface presented in terms of named)show 18 438 moveto ( abstract registers. For example, a VXI crate containing GE cards might support)show 18 426 moveto ( a register named 'G23.PoleZero', denoting the polezero adjuster on GE channel)show 18 414 moveto ( 23. The name space is constructed by the server using information derived from)show 18 402 moveto ( a configuration file supplied when the crate is claimed. This static)show 18 390 moveto ( configuration data can be correlated with information derived from)show 18 378 moveto ( auto-configuration procedures run at crate power up time to reveal broken or)show 18 366 moveto ( missing modules. Essentially, the register name space is determined by the)show 18 354 moveto ( numbers and types of modules present in the crate. Since we expect register)show 18 342 moveto ( names to appear in the user interface comments on a suitable naming convention)show 18 330 moveto ( are invited. The functions supported by these servers are: )show 18 318 moveto ( )show 18 306 moveto ( ClaimCrate == [crate?:ResourceName; cap!:Capability; status!:Report] )show 18 294 moveto ( FreeCrate == [crate?:ResourceName; cap?:Capability; status!:Report] )show 18 282 moveto ( )show 18 270 moveto ( InitialiseReg == [reg?:Register; status!:Report] )show 18 258 moveto ( ReadReg == [reg?:Register; val!:Value; status!:Report] )show 18 246 moveto ( WriteReg == [reg?:Register; val?:Value; status!:Report] )show 18 234 moveto ( InitialiseRegs == [pat?:Pattern; status!:Report] )show 18 222 moveto ( ReadRegs == [pat?:Pattern; rvlist!:seq \(Register,Value\); status!:Report] )show 18 210 moveto ( WriteRegs == [pat?:Pattern; val?:Value; status!:Report] )show 18 198 moveto ( InquireRegs == [pat?:Pattern; rlist!:seq Register; status!:Report] )show 18 186 moveto ()show 18 174 moveto ( The *Regs functions address registers by pattern matching on their names,)show 18 162 moveto ( using patterns based on regular expressions. The InquireRegs function returns)show 18 150 moveto ( a list of those register names matching a pattern and enables a client program)show 18 138 moveto ( to build a mapping between register names and the crates where they reside.)show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( The Initialise functions reset registers with safe default values. )show 18 762 moveto ()show 18 750 moveto ( With these primitives, a user interface can offer two functions for saving and)show 18 738 moveto ( restoring complete experimental configurations: )show 18 726 moveto ( )show 18 714 moveto ( SaveSetup == [file!:RegisterValueDataBase; status!:Report] )show 18 702 moveto ( RestoreSetup == [file?:RegisterValueDataBase; status!:Report] )show 18 690 moveto ()show 18 678 moveto ( In principle, all features of the frontend hardware can be accessed by these)show 18 666 moveto ( functions but in addition higher level functions are provided to support)show 18 654 moveto ( singles spectra and control of EbyE data flow: )show 18 642 moveto ()show 18 630 moveto ( InquireSpectra == [pat?:Pattern; slist!:seq Spectrum; status!:Report] )show 18 618 moveto ( InquireAttributes == [s?:Spectrum; attribs!:SpectrumAttributes; status!:Report] )show 18 606 moveto ( ReadSpectrum == [s?:Spectrum; dom?:Domain; counts!:seq Int; status!:Report] )show 18 594 moveto ( WriteSpectrum == [s?:Spectrum; dom?:Domain; counts?:seq Int; status!:Report] )show 18 582 moveto ( ZeroSpectrum == [s?:Spectrum; status!:Report] )show 18 570 moveto ( ReadAnnotation == [s?:Spectrum; anno?:Int; val!:seq Byte; status!:Report] )show 18 558 moveto ( WriteAnnotation == [s?:Spectrum; anno?:Int; val?:seq Byte; status!:Report] )show 18 546 moveto ( CreateSpectrum == [s?:Spectrum; attribs?:SpectrumAttributes; status!:Report] )show 18 534 moveto ( DeleteSpectrum == [s?:Spectrum; status!:Report] )show 18 522 moveto ( )show 18 510 moveto ( Go == [status!:Report] )show 18 498 moveto ( Halt == [status!:Report] )show 18 486 moveto ()show 18 474 moveto ( The spectrum functions are further described in the Event Processor Server)show 18 462 moveto ( section. )show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ( Event Processor Server\(s\) )show 18 426 moveto ( _________________________ )show 18 414 moveto ()show 18 402 moveto ( We view the EbyE data path as a pipeline effectively starting at the trigger)show 18 390 moveto ( unit \(TU\), passing through an event building stage \(EB\), and continuing to an)show 18 378 moveto ( event processing unit \(EP\), where it may split into several parallel)show 18 366 moveto ( pipelines, terminating in event storage \(ES\) units. Since both the EB and EP)show 18 354 moveto ( are capable of transforming the EbyE data under the control of a downloaded)show 18 342 moveto ( program, we treat them both as logical event processor units. We intend to)show 18 330 moveto ( construct the software supporting EbyE data paths to run autonomously without)show 18 318 moveto ( the need for explicit go and halt operations directed to individual units,)show 18 306 moveto ( since this gives rise to synchronising problems. We expect data flow to be)show 18 294 moveto ( controlled by a single enabling register in the trigger unit which inserts)show 18 282 moveto ( START and STOP tokens into the pipeline. All pipeline stages propagate these)show 18 270 moveto ( tokens and may take local action \(eg, change state\) if necessary. )show 18 258 moveto ()show 18 246 moveto ( Both EB and EP must be capable of accepting a downloaded event processing)show 18 234 moveto ( algorithm. Typically this is code cross compiled for a specific event)show 18 222 moveto ( processing platform by utilities running in the user interface. This code is)show 18 210 moveto ( dynamically linked into the environment provided by the event processing unit.)show 18 198 moveto ( The environment supports the input and output of events to the downloaded code)show 18 186 moveto ( and addressing mechanisms for memory resident spectra, for example. )show 18 174 moveto ()show 18 162 moveto ( Experience at the NSF has shown the value of a facility for making incremental)show 18 150 moveto ( changes to the event sorting procedure which avoids the need to recompile,)show 18 138 moveto ( link, and download a complete program. Such a facility is convenient for the)show 18 126 moveto ()show 18 114 moveto ( 3)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( majority of small changes to sorting parameters. We have generalised this idea)show 18 762 moveto ( to the concept of a 'sort object'--- essentially a named and typed piece of)show 18 750 moveto ( data that can be independently constructed by a user interface program and)show 18 738 moveto ( downloaded to an event processor. Typical objects include simple types such as)show 18 726 moveto ( integer bit masks and floating point constants, as well as composite types)show 18 714 moveto ( such as the set of coeficients of a gain matching polynomial and sets of one)show 18 702 moveto ( and two dimensional polygons representing sorting 'windows'. )show 18 690 moveto ()show 18 678 moveto ( We also recognise the need to selectively enable the routing of processed)show 18 666 moveto ( events onto any of several event storage streams, identified by small)show 18 654 moveto ( integers. )show 18 642 moveto ()show 18 630 moveto ( In summary, the set of functions recognised by event processing servers is: )show 18 618 moveto ()show 18 606 moveto ( ClaimEbyEProcessor == [proc?:ResourceName; cap!:Capability; status!:Report] )show 18 594 moveto ( FreeEbyEProcessor == [proc?:ResourceName; cap?:Capability; status!:Report] )show 18 582 moveto ( )show 18 570 moveto ( HaltProgram == [status!:Report] )show 18 558 moveto ( GoProgram == [status!:Report] )show 18 546 moveto ( DeleteProgram == [status!:Report] )show 18 534 moveto ( LoadProgram == [prog?:CompiledProgram; status!:Report] )show 18 522 moveto ( )show 18 510 moveto ( InquireObjects == [pat?:Pattern; objlist!:seq Object; status!:Report] )show 18 498 moveto ( InquireAttributes == [obj?:Object; attribs!:ObjectAttributes; status!:Report] )show 18 486 moveto ( CreateObject == [obj?:Object; attribs?:ObjectAttributes; status!:Report] )show 18 474 moveto ( DeleteObject == [obj?:Object; status!:Report] )show 18 462 moveto ( ReadObject == [obj?:Object; val!:ObjectValue; status!:Report] )show 18 450 moveto ( WriteObject == [obj?:Object; val?:ObjectValue; status!:Report] )show 18 438 moveto ( ReadObjects == [pat?:Pattern; objlist!:seq \(Object,ObjectAttributes,ObjectValue\); )show 18 426 moveto ( status!:Report] )show 18 414 moveto ( WriteObjects == [pat?:Pattern; val?:ObjectValue; status!:Report] )show 18 402 moveto ( )show 18 390 moveto ( AssociateStream == [str?:Stream; f?:FileHandle; cap?:Capability; status!:Report] )show 18 378 moveto ( DissociateStream == [str?:Stream; status!:Report] )show 18 366 moveto ( EnableStream == [str?:Stream; status!:Report] )show 18 354 moveto ( DisableStream == [str?:Stream; status!:Report] )show 18 342 moveto ()show 18 330 moveto ( In addition, the following functions support access to histograms generated by)show 18 318 moveto ( event processing: )show 18 306 moveto ( )show 18 294 moveto ( InquireSpectra == [pat?:Pattern; slist!:seq Spectrum; status!:Report] )show 18 282 moveto ( InquireAttributes == [s?:Spectrum; attribs!:SpectrumAttributes; status!:Report] )show 18 270 moveto ( ReadSpectrum == [s?:Spectrum; dom?:Domain; counts!:seq Int; status!:Report] )show 18 258 moveto ( WriteSpectrum == [s?:Spectrum; dom?:Domain; counts?:seq Int; status!:Report] )show 18 246 moveto ( ZeroSpectrum == [s?:Spectrum; status!:Report] )show 18 234 moveto ( ReadSpectrumProjected == [s?:Spectrum; poly?:Polygon; dom?:Domain; )show 18 222 moveto ( counts!:seq Int; status!:Report] )show 18 210 moveto ( ReadAnnotation == [s?:Spectrum; anno?: Int; val!:seq Byte; status!:Report] )show 18 198 moveto ( WriteAnnotation == [s?:Spectrum; anno?: Int; val?:seq Byte; status!:Report] )show 18 186 moveto ( CreateSpectrum == [s?:Spectrum; attribs?:SpectrumAttributes; status!:Report] )show 18 174 moveto ( DeleteSpectrum == [s?:Spectrum; status!:Report] )show 18 162 moveto ()show 18 150 moveto ( The ReadSpectrum and WriteSpectrum functions provide access to blocks of)show 18 138 moveto ( contiguous channels or 'Domains', ie intervals [n..m] in one dimensional)show 18 126 moveto ()show 18 114 moveto ( 4)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( spectra and rectangles [n..m] X [p..q] in two dimensional spectra. The)show 18 762 moveto ( ReadSpectrumProjected function provides an efficient way of extracting X and Y)show 18 750 moveto ( projections of a two dimensional spectrum above a polygonal window---a client)show 18 738 moveto ( program does not have to read a large array of counts in order to obtain such)show 18 726 moveto ( projections Simple one dimensional cuts are a special case of this function.)show 18 714 moveto ( Spectrum 'annotations' are pieces of opaque data identified by small integers)show 18 702 moveto ( that the server can associate with a spectrum. They are typically used to)show 18 690 moveto ( attach titles and calibrations to spectra. )show 18 678 moveto ()show 18 666 moveto ()show 18 654 moveto ( Event Storage Server )show 18 654 moveto ( ____________________ )show 18 642 moveto ()show 18 630 moveto ( This server is the final stage in an EbyE pipeline. It typically interfaces to)show 18 618 moveto ( a cluster of serial data storage units such as 6250 bpi tape drives, Exabytes,)show 18 606 moveto ( or better. The server can claim exclusive use of individual drives, mount and)show 18 594 moveto ( dismount labelled media, open and close data files, and read and write data)show 18 582 moveto ( records: )show 18 570 moveto ( )show 18 558 moveto ( ClaimDrive [d?:Drive; cap!:Capability; status!:Report] )show 18 546 moveto ( FreeDrive [d?:Drive; cap?:Capability; status!:Report] )show 18 534 moveto ( MountVolume [d?:Drive; volume?:Name; status!:Report] )show 18 522 moveto ( DismountVolume == [d?:Drive; status!:Report] )show 18 510 moveto ( OpenFile == [d?:Drive; file?:Name; mode?:Mode; f!:FileHandle; status!:Report] )show 18 498 moveto ( CloseFile == [f?:FileHandle; status!:Report] )show 18 486 moveto ( ReadFile == [f?:FileHandle; rec!:Record; status!:Report] )show 18 474 moveto ( WriteFile == [f?:FileHandle; rec?:Record; status!:Report] )show 18 462 moveto ( PositionFile == [f?:FileHandle; offset?:Int; status!:Report] )show 18 450 moveto ()show 18 438 moveto ( The FileHandle data type returned by OpenFile is an identifier for a file open)show 18 426 moveto ( on some drive. Note how a FileHandle obtained by a client program from a)show 18 414 moveto ( storage server is passed to an event processor via an AssociateStream request.)show 18 402 moveto ( The event processor also needs to know the capability for the corresponding)show 18 390 moveto ( drive before it can write data successfully. )show 18 378 moveto ( )show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 5)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( A Note on Readout Controller Data Format )show 18 750 moveto ( ________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Tuesday 12 June 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( In his paper 'Event-by-Event Data Formats', dated May 8 1990, Stathis)show 18 654 moveto ( Kossionides describes a 32bit format for data output by Eurogam Readout)show 18 642 moveto ( Controllers onto the DT32 bus leading to the Event Builder unit. )show 18 630 moveto ()show 18 618 moveto ( Most of the 32bit words placed on the DT32 bus have the following format: )show 18 606 moveto ( )show 18 594 moveto ( 2 14 16 )show 18 582 moveto ( +-+-+------------+----------------+ )show 18 570 moveto ( | v | address | data | )show 18 558 moveto ( +-+-+------------+----------------+ )show 18 546 moveto ()show 18 534 moveto ( Typically, the 16 bit 'data' field contains an ADC conversion, the 14 bit)show 18 522 moveto ( 'address' field identifies the ADC channel producing the data, and the 2 bit)show 18 510 moveto ( 'v' field contains trigger validation bits. )show 18 498 moveto ()show 18 486 moveto ( An exception to this occurs in the data words emitted by the Trigger Unit at)show 18 474 moveto ( the beginning of each event. The current proposal is that they should appear)show 18 462 moveto ( thus: )show 18 450 moveto ( )show 18 438 moveto ( 16 16 )show 18 426 moveto ( +----------------+----------------+ )show 18 414 moveto ( | @FFFF | @FFFF | )show 18 402 moveto ( +----------------+----------------+ )show 18 390 moveto ( | @AAAA | word count | )show 18 378 moveto ( +----------------+----------------+ )show 18 366 moveto ( | time stamp ms 32 bits | )show 18 354 moveto ( +----------------+----------------+ )show 18 342 moveto ( | time stamp ls 32 bits | )show 18 330 moveto ( +----------------+----------------+ )show 18 318 moveto ( | event number | )show 18 306 moveto ( +---+------------+----------------+ )show 18 294 moveto ( | v | address | data | )show 18 282 moveto ( +---+------------+----------------+ )show 18 270 moveto ( : : )show 18 258 moveto ( : : )show 18 246 moveto ( +---+------------+----------------+ )show 18 234 moveto ( | v | address | data | )show 18 222 moveto ( +---+------------+----------------+ )show 18 210 moveto ()show 18 198 moveto ( The presence of the two time stamp fields and the event number field)show 18 186 moveto ( represented in this form complicates what would otherwise be a simple and)show 18 174 moveto ( elegant data format. In particular it requires that the design of a hardware)show 18 162 moveto ( histogramming unit be unnecessarily complicated. Such a unit would have to)show 18 150 moveto ( 'know' the format of an event and skip over the time stamp and event number)show 18 138 moveto ( data, since these fields can in principle take arbitrary 32 bit values. )show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ()show 18 762 moveto ( My first suggestion is therefore that *all* words on the DT32 bus take the)show 18 750 moveto ( v/address/data form. A histogramming unit may then decide how to process a)show 18 738 moveto ( word by simply using the most significant 16 bits of the word as an index into)show 18 726 moveto ( a lookup table. Each word may then be treated independently of its)show 18 714 moveto ( predecessors, and the processing performed by the unit is then completely)show 18 702 moveto ( determined by the contents of the lookup table. )show 18 690 moveto ()show 18 678 moveto ( This begs the question of how to handle the time stamp and event number data.)show 18 666 moveto ( My initial response is to drop them from the specification altogether. I)show 18 654 moveto ( cannot see any use for the event number field, and if an event time stamp is)show 18 642 moveto ( required for a certain class of experiment then users can incorporate a time)show 18 630 moveto ( parameter derived from a clock module into their events. My point is that)show 18 618 moveto ( these fields are not *essential* for the proper operation of the data)show 18 606 moveto ( acquisition system and should therefore be left out on the grounds of)show 18 594 moveto ( simplicity. )show 18 582 moveto ()show 18 570 moveto ( However, assuming that there are good reasons for providing these parameters)show 18 558 moveto ( in the trigger unit I would then question whether the time stamp needs to be)show 18 546 moveto ( 64 bits wide and the event number 32 bits. I have not seen any justification)show 18 534 moveto ( for fields as wide as this. Stathis's paper merely states that this is)show 18 522 moveto ( 'already agreed' [section 5.2]. If these fields are reduced to 32 bits and 16)show 18 510 moveto ( bits respectively we get a fairly compact representation in the form: )show 18 498 moveto ( )show 18 486 moveto ( +-+-+------------+----------------+ )show 18 474 moveto ( | v | address1 | time stamp msb | )show 18 462 moveto ( +-+-+------------+----------------+ )show 18 450 moveto ( | v | address2 | time stamp lsb | )show 18 438 moveto ( +-+-+------------+----------------+ )show 18 426 moveto ( | v | address3 | event number | )show 18 414 moveto ( +-+-+------------+----------------+ )show 18 402 moveto ()show 18 390 moveto ( This representation shows that the time stamp and event number data can be)show 18 378 moveto ( thought of as pseudo data acquisition channels located in the trigger unit. If)show 18 366 moveto ( wider time stamp and event number fields are deemed essential then they can)show 18 354 moveto ( just be split into more 16 bit subfields prefixed with more reserved)show 18 342 moveto ( addresses. )show 18 330 moveto ()show 18 318 moveto ( My personal opinion is that in the absence of a reasoned case justifying the)show 18 306 moveto ( presence of these wide time stamp and event number fields the argument from)show 18 294 moveto ( the simplicity of a uniform v/address/data format takes precedence. )show 18 282 moveto ()show 18 270 moveto ( I would also question whether the word count fields are strictly necessary. If)show 18 258 moveto ( every 32 bit word is of the form v/address/data then the DT32 data stream is)show 18 246 moveto ( simply a sequence of 32 bit words with no counted string structure imposed)show 18 234 moveto ( upon it. This simplifies the design of the Readout Controllers and, by)show 18 222 moveto ( eliminating words from the data stream, reduces the DT32 bandwidth required.)show 18 210 moveto ( Stathis states that 'it was decided at the February meeting that the)show 18 198 moveto ( redundancy of a header plus word count pair is necessary to allow for testing)show 18 186 moveto ( the data integrity' [section 5]. This suggests that a lost word is seen as a)show 18 174 moveto ( likely failure mode of the Readout Controller, DT32 bus, and Event Builder)show 18 162 moveto ( combination which must be guarded against. It would be interesting to get a)show 18 150 moveto ( hardware designer's opinion on this point! In my experience data corruptions)show 18 138 moveto ( such as stuck bits are a more likely failure mode and so horizontal and)show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( longitudinal checksums would be more appropriate than word counts. But as far)show 18 762 moveto ( as I am aware, there is no provision in any of the hardware designs for parity)show 18 750 moveto ( bits on data paths, for example. )show 18 738 moveto ()show 18 726 moveto ( Finally, a suggestion for allocating reserved address values. We have)show 18 714 moveto ( 2**14=16384 possible values, @0000 to @3FFF inclusive. We should reserve \(say\))show 18 702 moveto ( 256 of these values in the range @3F00 to @3FFF to denote special tokens in)show 18 690 moveto ( the data stream, such as start event etc. So far I have identified the need)show 18 678 moveto ( for the following. X denotes don't care. )show 18 666 moveto ( )show 18 654 moveto ( 2 14 16 )show 18 642 moveto ( +-+-+------------+----------------+ )show 18 630 moveto ( |X X| 3FFF |XXXXXXXXXXXXXXXX| start event )show 18 618 moveto ( +-+-+------------+----------------+ )show 18 606 moveto ( |X X| 3FFE | ROC number | start ROC subevent )show 18 594 moveto ( +-+-+------------+----------------+ )show 18 582 moveto ( |X X| 3FFD | word count | word count \(if needed\) )show 18 570 moveto ( +-+-+------------+----------------+ )show 18 558 moveto ( |X X| 3FFC | time stamp ms | ms 16 bits of time stamp \(if needed\) )show 18 546 moveto ( +-+-+------------+----------------+ )show 18 534 moveto ( |X X| 3FFB | time stamp ls | ls 16 bits of time stamp \(if needed\) )show 18 522 moveto ( +-+-+------------+----------------+ )show 18 510 moveto ( |X X| 3FFA | event number | event number \(if needed\) )show 18 498 moveto ( +-+-+------------+----------------+ )show 18 486 moveto ( |X X| 3FF9 |XXXXXXXXXXXXXXXX| data collection start token )show 18 474 moveto ( +-+-+------------+----------------+ )show 18 462 moveto ( |X X| 3FF8 |XXXXXXXXXXXXXXXX| data collection stop token )show 18 450 moveto ( +-+-+------------+----------------+ )show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Eurogam Frontend System Software Requirements )show 18 750 moveto ( _____________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Thursday 28 June 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Introduction )show 18 666 moveto ( ____________ )show 18 654 moveto ()show 18 642 moveto ( This document is an attempt to present an overall picture of the operational)show 18 630 moveto ( requirements for the software associated the Eurogam frontend. For the)show 18 618 moveto ( purposes of this paper the EG frontend is taken to be the detectors, the)show 18 606 moveto ( array, cabling, VXI electronics, trigger unit, histogrammer unit, high voltage)show 18 594 moveto ( system, autofill system, and environmental monitoring associated with these)show 18 582 moveto ( components. The paper does not discuss Event Builder or Event Sorter)show 18 570 moveto ( components, and mentions diagnostics and test facilities only in passing. )show 18 558 moveto ()show 18 546 moveto ( Detectors )show 18 546 moveto ( _________ )show 18 534 moveto ()show 18 522 moveto ( There are no digital systems intimately involved with the EG detectors.)show 18 510 moveto ( However, the large number of units \(upto 70 GEs and 700 BGO crystals\) and the)show 18 498 moveto ( fact that their characteristics change with time suggests that some sort of)show 18 486 moveto ( computerised management of detector related data is desirable. Two parameters)show 18 474 moveto ( of particular interest during an experiment are a detector's resolution and)show 18 462 moveto ( its preferred bias voltage. A database of detector data containing at least)show 18 450 moveto ( these parameters should therefore be available online for inspection during)show 18 438 moveto ( experiments and at other times. The database should be maintained by the)show 18 426 moveto ( detector support staff and be read-only to everyone else. A naming scheme for)show 18 414 moveto ( detectors \(as distinct from array positions\) is essential. )show 18 402 moveto ()show 18 390 moveto ( Array and Cabling )show 18 390 moveto ( _________________ )show 18 378 moveto ()show 18 366 moveto ( Again, there are no digital systems associated with the array as such, but the)show 18 354 moveto ( cabling from the array to the VXI electronics determines a mapping between)show 18 342 moveto ( array positions and VXI data acquisition channels. Users will wish to refer to)show 18 330 moveto ( a computer controlled VXI channel parameter using a name reflecting the array)show 18 318 moveto ( position to which the channel is cabled. This implies a labelling scheme for)show 18 306 moveto ( array positions and a labelling scheme for sockets on the front panels of VXI)show 18 294 moveto ( modules. The names used must be clearly marked on the equipment. These)show 18 282 moveto ( externally visible names must be identical to the names used in technical)show 18 270 moveto ( documentation. The cabling relationships will be relatively static but)show 18 258 moveto ( provision has to be made for recabling of array positions to different VXI)show 18 246 moveto ( channels during an experiment. )show 18 234 moveto ()show 18 222 moveto ( Similar remarks apply concerning the cabling from array positions to the high)show 18 210 moveto ( voltage detector power supplies. )show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( VXI Electronics )show 18 774 moveto ( _______________ )show 18 762 moveto ()show 18 750 moveto ( Both the GE and the BGO modules have analogue and digital parameters under)show 18 738 moveto ( software control. Users must be able to inspect and modify these parameters)show 18 726 moveto ( both individually and in groups. There must be provision for saving the state)show 18 714 moveto ( of some or all parameters and subsequently restoring them. It must be possible)show 18 702 moveto ( to refer to parameters using meaniningful names reflecting their purpose and)show 18 690 moveto ( the acquisition channel\(s\) which they affect. Users must be able to refer to)show 18 678 moveto ( acquisition channels by means of the corresponding array position name.)show 18 666 moveto ( Analogue parameters must be settable and presentable in terms of meaningful)show 18 654 moveto ( physical units. This implies the existence of calibration functions for each)show 18 642 moveto ( parameter class, for each module, or possibly for individual acquisition)show 18 630 moveto ( channels. Maintenance staff will find it useful to refer to acquisition)show 18 618 moveto ( channel parameters by geographical module position and front panel socket)show 18 606 moveto ( name. This implies a geographical naming scheme for module positions. )show 18 594 moveto ()show 18 582 moveto ( Trigger Unit )show 18 582 moveto ( ____________ )show 18 570 moveto ()show 18 558 moveto ( The EG trigger unit contains analogue and digital parameters under software)show 18 546 moveto ( control. These parameters should be named in a similar style to VXI module)show 18 534 moveto ( parameters. The remarks in the previous paragraph concerning accessing VXI)show 18 522 moveto ( module parameters also apply to trigger unit parameters, where appropriate. )show 18 510 moveto ()show 18 498 moveto ( Histogrammer Unit )show 18 498 moveto ( _________________ )show 18 486 moveto ()show 18 474 moveto ( This unit sits on the DT32 readout bus kicksorting event data into local)show 18 462 moveto ( memory under software control. Users must be able to refer to the resulting)show 18 450 moveto ( histograms using names derived from those of the acquisition channels sourcing)show 18 438 moveto ( the data. The software controlling the histogrammer unit must present the)show 18 426 moveto ( histograms through a set of spectrum access functions which will be common to)show 18 414 moveto ( all classes of spectra supported by the system. These functions must provide)show 18 402 moveto ( for creating, deleting, reading, writing, zeroing, titling and calibrating the)show 18 390 moveto ( spectra. )show 18 378 moveto ()show 18 366 moveto ( High Voltage System )show 18 366 moveto ( ___________________ )show 18 354 moveto ()show 18 342 moveto ( Bias for the detectors is provided by LeCroy high voltage supplies controlled)show 18 330 moveto ( through a VME interface module. The software driving the LeCroy system should)show 18 318 moveto ( model the power supplies as a set of parameters named by analogy with the VXI)show 18 306 moveto ( module parameters outlined above. Users must be able to inspect and modify)show 18 294 moveto ( these parameters both individually and in groups. There must be provision for)show 18 282 moveto ( saving the state of some or all parameters and subsequently restoring them.)show 18 270 moveto ( Users must be able to read and set biases using array position names and)show 18 258 moveto ( detector names at will. In particular, it should be possible to set detector)show 18 246 moveto ( biases by reference to the preferred bias values found in the detector)show 18 234 moveto ( database. Although the location of detectors and the cabling of their power)show 18 222 moveto ( supplies will be relatively static provision must be made for replacing)show 18 210 moveto ( detectors within the array and for recabling an array position to a different)show 18 198 moveto ( power supply during an experiment. )show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Autofill System )show 18 774 moveto ( _______________ )show 18 762 moveto ()show 18 750 moveto ( Don't know much about this yet. )show 18 738 moveto ()show 18 726 moveto ( Environment Monitoring )show 18 726 moveto ( ______________________ )show 18 714 moveto ()show 18 702 moveto ( The crates housing the VXI modules and their power supplies are mounted in)show 18 690 moveto ( water cooled racks. Users must be able to inspect temperatures, currents and)show 18 678 moveto ( voltages from time to time, referring to these parameters by a naming)show 18 666 moveto ( convention in accord with naming schemes adopted for VXI and other parameters.)show 18 654 moveto ( The naming scheme must reflect the geographical positions of components in the)show 18 642 moveto ( EG racking. )show 18 630 moveto ()show 18 618 moveto ( User Interface )show 18 618 moveto ( ______________ )show 18 606 moveto ()show 18 594 moveto ( There should be a character terminal oriented command line interface for)show 18 582 moveto ( inspecting and updating frontend parameters both singly and in groups. Groups)show 18 570 moveto ( should be defined by pattern matching on parameter names. In addition a WIMP)show 18 558 moveto ( style interface should also be provided. This must be capable of presenting)show 18 546 moveto ( and setting groups of parameters laid out on a screen in tabular form. Groups)show 18 534 moveto ( requiring frequent inspection should be readily available by selection from a)show 18 522 moveto ( menu. Subsets of parameters to be made the object of further action such as)show 18 510 moveto ( updating should be selectable by mouse pointing. It should be possible to make)show 18 498 moveto ( adjustments to analogue parameters in VXI modules such as CFDs and PoleZeros)show 18 486 moveto ( by means of graphical analogues of potentiometers such as scroll bars and)show 18 474 moveto ( sliders. )show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( OS-9 versus VxWorks )show 18 750 moveto ( ___________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Thursday 28 June 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This paper compares the suitability of OS-9 and VxWorks as environments for EG)show 18 654 moveto ( frontend system software. )show 18 642 moveto ()show 18 630 moveto ( Functionality )show 18 630 moveto ( _____________ )show 18 618 moveto ()show 18 606 moveto ( OS-9 is a small \(multi-user\) operating system for single board 68000 based)show 18 594 moveto ( computers. It offers a complete, self-contained development environment using)show 18 582 moveto ( VT100 terminals and unix-like shell. VxWorks is a real-time executive for)show 18 570 moveto ( multi-tasking VME based embedded systems. All development work is done by)show 18 558 moveto ( cross compilation in a WIMP environment on a workstation. Both systems provide)show 18 546 moveto ( the basic functionality we need to develop and run the currently planned)show 18 534 moveto ( frontend system software. )show 18 522 moveto ()show 18 510 moveto ( Networking )show 18 510 moveto ( __________ )show 18 498 moveto ()show 18 486 moveto ( All EG frontend systems act as servers on an Ethernet LAN responding to)show 18 474 moveto ( requests from user interface systems. Some also participate in higher)show 18 462 moveto ( bandwidth point to point communications. Both OS-9 and VxWorks support the)show 18 450 moveto ( Internet protocols including the TCP based telnet and ftp. The VxWorks)show 18 438 moveto ( implementation is more developed, offering RPC and UDP as well as rsh and)show 18 426 moveto ( rlogin to remote unix systems in addition to ftp and telnet. VxWorks has)show 18 414 moveto ( application interfaces at all levels of the protocol stack. OS-9 provides a)show 18 402 moveto ( program interface to TCP but there is some doubt as to whether a UDP interface)show 18 390 moveto ( is available. Current plans are to use UDP as a carrier for a client-server)show 18 378 moveto ( RPC in EG. )show 18 366 moveto ()show 18 354 moveto ( Fittedness )show 18 354 moveto ( __________ )show 18 342 moveto ()show 18 330 moveto ( VxWorks emphasises real time performance---prioritised scheduling, low)show 18 318 moveto ( interrupt and context switch latency. OS-9 offers unix-like round-robin)show 18 306 moveto ( scheduling. Our application is *not* inherently real time. Time critical)show 18 294 moveto ( response to real world events such as required in a flight control system or)show 18 282 moveto ( chemical processing plant are not necessary. Current ideas require just a)show 18 270 moveto ( single network server program in each VXI crate. As far as I'm aware the)show 18 258 moveto ( processors in the EB and EP processor farms will also run a single task. We)show 18 246 moveto ( have already built OS-9 based accelerator control system components running)show 18 234 moveto ( *more* tasks per processor than the intended EG application. A better model)show 18 222 moveto ( for the software structures required for EG systems is that currently running)show 18 210 moveto ( in the NSF 'A' processors. )show 18 198 moveto ()show 18 186 moveto ( Self-sufficiency )show 18 186 moveto ( ________________ )show 18 174 moveto ()show 18 162 moveto ( An OS-9 system \(plus terminal\) can provide a self-contained system with a)show 18 150 moveto ( familiar style of command language for the maintenance engineer's bench. Using)show 18 138 moveto ( VxWorks, the maintenance engineer will require either a very complete set of)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( test programs prepared in advance for him or he will need his own development)show 18 762 moveto ( workstation to write the programs himself. He will have to learn the VxWorks)show 18 750 moveto ( operating environment. The VxWorks 'shell' is not a conventional command)show 18 738 moveto ( language interpreter like VMS's DCL or unix shell. Instead it's essentially an)show 18 726 moveto ( interpreter for 'C' language expressions. At this stage it's not clear how)show 18 714 moveto ( suitable this will be for use by maintenance as opposed to software engineers.)show 18 702 moveto ()show 18 690 moveto ( In house experience )show 18 690 moveto ( ___________________ )show 18 678 moveto ()show 18 666 moveto ( We have a number of OS-9 systems in use and a couple of years of experience)show 18 654 moveto ( using them. VxWorks will be completely new to us. )show 18 642 moveto ()show 18 630 moveto ( Relative costs )show 18 630 moveto ( ______________ )show 18 618 moveto ()show 18 606 moveto ( The software price for two OS-9 systems for EG development and one for)show 18 594 moveto ( maintenance is about 6000 pounds. The VxWorks deal we are being currently)show 18 582 moveto ( offered is much more expensive. It buys many more seats than we need and much)show 18 570 moveto ( more sophisticated software. The VxWorks WIMP cross-development environment)show 18 558 moveto ( with source-level debugging is excellent but I would question whether the size)show 18 546 moveto ( and complexity of the software we have to develop justifies the extra costs)show 18 534 moveto ( over the simpler but quite adequate OS-9. My understanding is that the)show 18 522 moveto ( operational software is to be developed in the UK where we already have OS-9)show 18 510 moveto ( experience. )show 18 498 moveto ()show 18 486 moveto ( Conclusion )show 18 486 moveto ( __________ )show 18 474 moveto ()show 18 462 moveto ( Accepting VxWorks \(a foregone conclusion!\) will cost the project unnecessary)show 18 450 moveto ( expenditure. Make an issue of this and use it as a bargaining point in other)show 18 438 moveto ( negotiations. )show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Data Formats on the DT32 Bus )show 18 750 moveto ( ____________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Wednesday 18 July 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This document summarises discussion between Marie-Madeleine Aleonard, Vic)show 18 654 moveto ( Pucknell, John Cresswell, and myself, following on from my earlier paper 'A)show 18 642 moveto ( Note On Readout Controller Data Format' \(itself a follow up to Stathis)show 18 630 moveto ( Kossionides's paper on Event Formats\) and inquiries with UK physicists. )show 18 618 moveto ()show 18 606 moveto ( The data stream on the DT32 bus has the following format: )show 18 594 moveto ()show 18 582 moveto ( DT32 = [Token | Event]* )show 18 570 moveto ( Token = StartToken | StopToken )show 18 558 moveto ( Event = StartEvent SubEvent* EndEvent )show 18 546 moveto ( Subevent = DataWord+ EndSubEvent )show 18 534 moveto ()show 18 522 moveto ( In other words, the data consists of a stream of repeated Tokens or Events. A)show 18 510 moveto ( Token can be a data taking StartToken or StopToken word. An Event consists of)show 18 498 moveto ( an StartEvent word followed by zero or more SubEvents followed by an EndEvent)show 18 486 moveto ( word. A SubEvent consists of one or more DataWords followed by an EndSubEvent)show 18 474 moveto ( word. )show 18 462 moveto ()show 18 450 moveto ( StartEvent token )show 18 450 moveto ( ________________ )show 18 438 moveto ()show 18 426 moveto ( )show 18 414 moveto ( 2 6 8 6 10 )show 18 402 moveto ( +-+-----+--------+-----+----------+ )show 18 390 moveto ( |3| @3F | @FF | e | @3FF | )show 18 378 moveto ( +-+-----+--------+-----+----------+ )show 18 366 moveto ( )show 18 354 moveto ( The StartEvent word is emitted by the Trigger unit. The StartEvent word \(and)show 18 342 moveto ( all other non DataWords\) must be distinguishable from all other words that may)show 18 330 moveto ( properly appear on the DT32 bus. )show 18 318 moveto ()show 18 306 moveto ( The e field is a cyclic event number. )show 18 306 moveto ( _ )show 18 294 moveto ()show 18 282 moveto ( EndEvent token )show 18 282 moveto ( ______________ )show 18 270 moveto ()show 18 258 moveto ( )show 18 246 moveto ( 2 6 8 6 10 )show 18 234 moveto ( +-+-----+--------+-----+----------+ )show 18 222 moveto ( |3| @3E | @FF | e | @3FF | )show 18 210 moveto ( +-+-----+--------+-----+----------+ )show 18 198 moveto ( )show 18 186 moveto ()show 18 174 moveto ( This word enables the Event Builder unit to detect when all the data for an)show 18 162 moveto ( event has arrived in its buffer and processing can begin. It may be possible)show 18 150 moveto ( to detect this condition via hardware signals, in which case the EndEvent word)show 18 138 moveto ( can be omitted without loss. The e field must match that of the corresponding)show 18 138 moveto ( _ )show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( StartEvent. )show 18 762 moveto ()show 18 750 moveto ( EndSubEvent token )show 18 750 moveto ( _________________ )show 18 738 moveto ()show 18 726 moveto ( )show 18 714 moveto ( 2 6 8 6 10 )show 18 702 moveto ( +-+-----+--------+-----+----------+ )show 18 690 moveto ( |3| @3E | r | e | w | )show 18 678 moveto ( +-+-----+--------+-----+----------+ )show 18 666 moveto ( )show 18 654 moveto ( A SubEvent contains the data read out by a single Readout Controller \(ROC\).)show 18 642 moveto ( The r field labels the ROC. It is important that r fields do not clash with)show 18 642 moveto ( _ )show 18 630 moveto ( the g fields in DataWord addresses \(see below\) and the corresponding field in)show 18 618 moveto ( other tokens. Hence we have chosen to label ROCs with r values in the range)show 18 606 moveto ( @F0,@F1,...,@FE. The e field must match the corresponding field in the)show 18 606 moveto ( _ )show 18 594 moveto ( preceeding StartEvent and serves as a check on the functioning of the)show 18 582 moveto ( \(buffered\) ROC. The w field is a count of the words emitted by the ROC. It)show 18 582 moveto ( _ )show 18 570 moveto ( should thus be one greater than the number of DataWords in the SubEvent. )show 18 558 moveto ()show 18 546 moveto ( DataWord Coding )show 18 546 moveto ( _______________ )show 18 534 moveto ()show 18 522 moveto ( )show 18 510 moveto ( 2 14 16 )show 18 498 moveto ( +-+-+------------+----------------+ )show 18 486 moveto ( | q | address | data | )show 18 474 moveto ( +-+-+------------+----------------+ )show 18 462 moveto ( )show 18 450 moveto ( The q field contains pileup qualifier bits from VXI cards. )show 18 450 moveto ( _ )show 18 438 moveto ()show 18 426 moveto ( The address field labels the VXI ADC which sourced the data. We have)show 18 426 moveto ( _______ )show 18 414 moveto ( structured the address fields into a Group field g, and an Item field i. )show 18 414 moveto ( _ _ )show 18 402 moveto ()show 18 390 moveto ( )show 18 378 moveto ( 6 8 )show 18 366 moveto ( +----+-------+ )show 18 354 moveto ( | i | g | )show 18 342 moveto ( +----+-------+ )show 18 330 moveto ()show 18 318 moveto ( A Group consists of all the data from a Germanium detector and its associated)show 18 306 moveto ( shield detectors, using the Item field to distinguish between individual ADCs.)show 18 294 moveto ( Typically we would have i in the range 0,1,2,...,9 and g in the range)show 18 282 moveto ( 1,2,...,70. Values of i and g that clash with corresponding fields in non)show 18 270 moveto ( DataWords must be avoided when the VXI ADC address registers are loaded. )show 18 258 moveto ()show 18 246 moveto ( Data Taking StartToken )show 18 246 moveto ( ______________________ )show 18 234 moveto ()show 18 222 moveto ( 2 6 8 16 )show 18 210 moveto ( +-+-----+--------+----------------+ )show 18 198 moveto ( |3| @3D | @FF | @FFFF | )show 18 186 moveto ( +-+-----+--------+----------------+ )show 18 174 moveto ()show 18 162 moveto ( This token is placed in the data stream by the Trigger unit when data)show 18 150 moveto ( collection is enabled. )show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Data Taking StopToken )show 18 774 moveto ( _____________________ )show 18 762 moveto ()show 18 750 moveto ( 2 6 8 16 )show 18 738 moveto ( +-+-----+--------+----------------+ )show 18 726 moveto ( |3| @3C | @FF | @FFFF | )show 18 714 moveto ( +-+-----+--------+----------------+ )show 18 702 moveto ()show 18 690 moveto ( This token is placed in the data stream by the Trigger unit when data)show 18 678 moveto ( collection has been disabled and all partially read out events have been)show 18 666 moveto ( flushed from ROC buffers. )show 18 654 moveto ()show 18 642 moveto ( Trigger unit datawords )show 18 642 moveto ( ______________________ )show 18 630 moveto ()show 18 618 moveto ( The Trigger unit furnishes several parameters relating to each event as a)show 18 606 moveto ( whole \(various multiplicities\). These appear on the DT32 bus as a SubEvent)show 18 594 moveto ( generated by a ROC with r = @3E. In other words, the Trigger unit consumes one)show 18 582 moveto ( of the ROC r numbers. )show 18 570 moveto ()show 18 558 moveto ()show 18 546 moveto ()show 18 534 moveto ()show 18 522 moveto ()show 18 510 moveto ()show 18 498 moveto ()show 18 486 moveto ()show 18 474 moveto ()show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Conventions for VXI modules )show 18 750 moveto ( ___________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Wednesday 5 September 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( I would like to establish a few ground rules for Eurogam's VXI modules. Here)show 18 654 moveto ( are my suggestions: )show 18 642 moveto ()show 18 630 moveto ( o All modules should be 'static configuration' register-based devices, as)show 18 618 moveto ( defined in the VXI specification. )show 18 606 moveto ()show 18 594 moveto ( o The resource manager software should implement a 'static configuration')show 18 582 moveto ( resource manager. )show 18 570 moveto ()show 18 558 moveto ( o One or more 'Manufacturer ID numbers' should be obtained from the VXI)show 18 546 moveto ( consortium. Every board manufactured by the EG community must bear one of)show 18 534 moveto ( this set of id numbers in its 'ID' register \(configuration register at)show 18 522 moveto ( offset 0\). )show 18 510 moveto ()show 18 498 moveto ( o Model codes should be allocated for each board type and patched into each)show 18 486 moveto ( board's 'device type' register \(configuration register at offset 2\). Model)show 18 474 moveto ( codes should consist of a basic model type number \(8 bits, say\) and a)show 18 462 moveto ( revision level number \(4 bits say\). The revision level is to accommodate)show 18 450 moveto ( anticipated design variations on the basic boards, not in-the-field)show 18 438 moveto ( modifications to correct bugs. )show 18 426 moveto ()show 18 414 moveto ( o Each board should have a 16 bit serial number patched into the)show 18 402 moveto ( configuration register at offset 8. Regardless of manufacturer, boards of a)show 18 390 moveto ( given model type must have unique serial numbers, ensured, for example, by)show 18 378 moveto ( partitioning the serial numbers among the EG 'manufacturers'. Pairs \(model)show 18 366 moveto ( type, serial number\) will be unique within the EG community. Triples)show 18 354 moveto ( \(manufacturer id, model type, serial number\) should be unique throughout)show 18 342 moveto ( the world. )show 18 330 moveto ()show 18 318 moveto ( o Each board should have a 16 bit modification level patched into the)show 18 306 moveto ( configuration register at offset 10. This is to record the 'in-the-field')show 18 294 moveto ( bug correction modification state. )show 18 282 moveto ()show 18 270 moveto ( o Each board should be allocated a unique logical address within the EG)show 18 258 moveto ( community when first manufactured which it keeps throughout its life. It's)show 18 246 moveto ( unlikely that the EG community will own more than 255 boards, and this will)show 18 234 moveto ( ensure that logical addresses do not need adjusting as boards move between)show 18 222 moveto ( crates. )show 18 210 moveto ()show 18 198 moveto ( o Someone should be appointed to oversee the allocation and maintenance of)show 18 186 moveto ( these numbers to prevent chaos breaking out. This is especially important)show 18 174 moveto ( if we are to have more than one 'manufacturer'. )show 18 162 moveto ()show 18 150 moveto ( This may appear like overkill but it won't take much effort just to follow)show 18 138 moveto ( these conventions. There are benefits to be had in getting board)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( identification right, mainly through enabling software to configure itself)show 18 762 moveto ( rather than having to be told all the time what it's dealing with. )show 18 750 moveto ()show 18 738 moveto ()show 18 726 moveto ()show 18 714 moveto ()show 18 702 moveto ()show 18 690 moveto ()show 18 678 moveto ()show 18 666 moveto ()show 18 654 moveto ()show 18 642 moveto ()show 18 630 moveto ()show 18 618 moveto ()show 18 606 moveto ()show 18 594 moveto ()show 18 582 moveto ()show 18 570 moveto ()show 18 558 moveto ()show 18 546 moveto ()show 18 534 moveto ()show 18 522 moveto ()show 18 510 moveto ()show 18 498 moveto ()show 18 486 moveto ()show 18 474 moveto ()show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( A scheme for accessing online spectra )show 18 750 moveto ( _____________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Friday 7 September 1990 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This note outlines a rather elegant scheme for accessing online spectra. The)show 18 654 moveto ( basic idea is to map online spectra into the network filing system so that)show 18 642 moveto ( they look just like saved spectrum files. The scheme would work as follows. )show 18 630 moveto ()show 18 618 moveto ( Each crate supporting online spectra \(eg a frontend crate containing a)show 18 606 moveto ( histogrammer or an event sorting processor\) runs an online spectrum server)show 18 594 moveto ( program supporting the NFS protocol. These crates appear to client machines as)show 18 582 moveto ( conventional NFS hosts prepared to export parts of their file systems to other)show 18 570 moveto ( systems. However, these 'file systems' are not genuine disc based filing)show 18 558 moveto ( structures. Instead, they are memory based data structures which present)show 18 546 moveto ( themselves as files to the outside world. Client machines mount these 'file)show 18 534 moveto ( systems' onto their own directory structures in the usual NFS way. When a)show 18 522 moveto ( client reads a 'file' in such a 'file system' an NFS ReadFile RPC is made to)show 18 510 moveto ( the remote server which interprets this as a request to read, say, a block of)show 18 498 moveto ( counts from the associated spectrum. Similarly, creating a new 'file')show 18 486 moveto ( corresponds to allocating a new spectrum. Essentially what is happenning is a)show 18 474 moveto ( kind of memory mapped io. Any disc based spectrum format defines a spectrum)show 18 462 moveto ( file as a randomly addressible contiguous space of bytes. Somewhere within)show 18 450 moveto ( this space lie attributes, counts, annotations, etc. The spectrum server)show 18 438 moveto ( monitors the addresses of bytes being read and written and maps these requests)show 18 426 moveto ( into actual io on the memory modules holding the counts and stored data)show 18 414 moveto ( structures holding attribute and annotation information. In addition, the)show 18 402 moveto ( server maintains 'directory' like data structures, again in main memory, to)show 18 390 moveto ( support NFS ReadDirectory RPCs. )show 18 378 moveto ()show 18 366 moveto ( In principle, this is a rather nice idea with substantial benefits: )show 18 354 moveto ()show 18 342 moveto ( o client program software does not have to distinguish between remotely held)show 18 330 moveto ( online spectra and saved spectra on disc. All spectra conform to a common)show 18 318 moveto ( format. Spectra could be saved to disc using 'cp'! )show 18 306 moveto ()show 18 294 moveto ( o online spectra appear in directories apparently in client filing systems)show 18 282 moveto ( and can be be viewed with familiar directory inspection tools such as 'ls'.)show 18 270 moveto ()show 18 258 moveto ( There are some potential implementation problems, however: )show 18 246 moveto ()show 18 234 moveto ( o Client systems have to be \(probably unix\) machines supporting client side)show 18 222 moveto ( NFS. )show 18 210 moveto ()show 18 198 moveto ( o Extracting cuts and projections from 2d spectra incurrs the penalty of)show 18 186 moveto ( reading the counts over the network which can be significant in the worst)show 18 174 moveto ( case. Consider a 2K by 2K by 16 bit 2d spectrum with counts ordered with)show 18 162 moveto ( first dimension \(x\) varying fastest. To extract an x=constant cut involves)show 18 150 moveto ( walking through the counts with a stride of 2K channels or 4K bytes. This)show 18 138 moveto ( requires at least 1024 RPC transactions with the server, since each)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( transaction can return no more than 8K contiguous bytes \(in a typical UDP)show 18 762 moveto ( implementation\). )show 18 750 moveto ()show 18 738 moveto ( )show 18 726 moveto ( )show 18 714 moveto ( Here is how the memory mapping works: )show 18 702 moveto ( )show 18 690 moveto ( )show 18 678 moveto ( histogramming memory )show 18 666 moveto ( server main memory )show 18 654 moveto ( +------------+ )show 18 642 moveto ( | | +------------+ )show 18 630 moveto ( spectrum memory map | | | | )show 18 618 moveto ( | | | | )show 18 606 moveto ( 0 +---------+ ---------------------------------->+------------+ )show 18 594 moveto ( | attribs | | | | attributes | )show 18 582 moveto ( 256 +---------+ -------->+------------+ +------------+ )show 18 570 moveto ( | | | | | | )show 18 558 moveto ( | | | | | | )show 18 546 moveto ( | counts | | counts | | | )show 18 534 moveto ( | | | | | | )show 18 522 moveto ( | | | | | | )show 18 510 moveto ( | | | | | | )show 18 498 moveto ( 1280 +---------+ ---------------------------------->+------------+ )show 18 486 moveto ( | | | | | title | )show 18 474 moveto ( | title | | | | | )show 18 462 moveto ( | | | | | | )show 18 450 moveto ( 1360 +---------+ | | +------------+ )show 18 438 moveto ( | | | | )show 18 426 moveto ( +------------+ | | )show 18 414 moveto ( | | )show 18 402 moveto ( +------------+ )show 18 390 moveto ( )show 18 378 moveto ( )show 18 366 moveto ( The alternative to this scheme is, of course, to define explicit RPCs for)show 18 354 moveto ( accessing online spectra. This will result in a more complicated spectrum)show 18 342 moveto ( access library for client programs. However, by providing explicit RPCs for)show 18 330 moveto ( the common kinds of cut and projection we can significantly reduce the network)show 18 318 moveto ( traffic required for the worst cases. I would expect these to be dominated by)show 18 306 moveto ( the processing time in the server crate. )show 18 294 moveto ()show 18 282 moveto ( Comments welcomed. )show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Data Formats on the DT32 Bus )show 18 750 moveto ( ____________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Wednesday 18 July 1990 )show 18 690 moveto ( Thursday 20 September 1990 )show 18 678 moveto ( +----------------------------------------------------------------------------+)show 18 666 moveto ()show 18 654 moveto ( This document summarises discussion between Marie-Madeleine Aleonard, Vic)show 18 642 moveto ( Pucknell, John Cresswell, and myself, following on from my earlier paper 'A)show 18 630 moveto ( Note On Readout Controller Data Format' \(itself a follow up to Stathis)show 18 618 moveto ( Kossionides's paper on Event Formats\) and inquiries with UK physicists. |)show 18 606 moveto ( Changes made in September 1990 following discussion with John Alexander are |)show 18 594 moveto ( marked in the right margin. |)show 18 582 moveto ()show 18 570 moveto ( The data stream on the DT32 bus has the following format: )show 18 558 moveto ()show 18 546 moveto ( DT32 = [Token | Event]* )show 18 534 moveto ( Token = StartToken | StopToken )show 18 522 moveto ( Event = StartEvent SubEvent* EndEvent )show 18 510 moveto ( Subevent = DataWord* EndSubEvent |)show 18 498 moveto ()show 18 486 moveto ( In other words, the data consists of a stream of repeated Tokens or Events. A)show 18 474 moveto ( Token can be a data taking StartToken or StopToken word. An Event consists of)show 18 462 moveto ( an StartEvent word followed by zero or more SubEvents followed by an EndEvent)show 18 450 moveto ( word. A SubEvent consists of zero or more DataWords followed by an EndSubEvent |)show 18 438 moveto ( word. |)show 18 426 moveto ()show 18 414 moveto ( StartEvent word )show 18 414 moveto ( _______________ )show 18 402 moveto ( )show 18 390 moveto ( 2 6 8 6 10 )show 18 378 moveto ( +-+-----+--------+-----+----------+ )show 18 366 moveto ( |3| @3F | @FF | e | @3FF | )show 18 354 moveto ( +-+-----+--------+-----+----------+ )show 18 342 moveto ( )show 18 330 moveto ( The StartEvent word is emitted by the Trigger unit. The StartEvent word \(and)show 18 318 moveto ( all other non DataWords\) must be distinguishable from all other words that may)show 18 306 moveto ( properly appear on the DT32 bus. )show 18 294 moveto ()show 18 282 moveto ( The e field is a cyclic event number. )show 18 282 moveto ( _ )show 18 270 moveto ()show 18 258 moveto ( EndEvent word )show 18 258 moveto ( _____________ )show 18 246 moveto ( )show 18 234 moveto ( 2 6 8 6 10 )show 18 222 moveto ( +-+-----+--------+-----+----------+ )show 18 210 moveto ( |3| @3E | @FF | e | @3FF | )show 18 198 moveto ( +-+-----+--------+-----+----------+ )show 18 186 moveto ( )show 18 174 moveto ()show 18 162 moveto ( This word enables the Event Builder unit to detect when all the data for an)show 18 150 moveto ( event has arrived in its buffer and processing can begin. It may be possible)show 18 138 moveto ( to detect this condition via hardware signals, in which case the EndEvent word)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( can be omitted without loss. The e field must match that of the corresponding)show 18 774 moveto ( _ )show 18 762 moveto ( StartEvent. )show 18 750 moveto ()show 18 738 moveto ( EndSubEvent word )show 18 738 moveto ( ________________ )show 18 726 moveto ( )show 18 714 moveto ( 2 6 8 6 10 )show 18 702 moveto ( +-+-----+--------+-----+----------+ )show 18 690 moveto ( |3| @3E | r | e | w | )show 18 678 moveto ( +-+-----+--------+-----+----------+ )show 18 666 moveto ( )show 18 654 moveto ( A SubEvent contains the data read out by a single Readout Controller \(ROC\).)show 18 642 moveto ( The r field labels the ROC. It is important that r fields do not clash with)show 18 642 moveto ( _ )show 18 630 moveto ( the g fields in DataWord addresses \(see below\) and the corresponding field in)show 18 618 moveto ( other non DataWords. Hence we have chosen to label ROCs with r values in the)show 18 606 moveto ( range @F0,@F1,...,@FE. The e field must match the corresponding field in the)show 18 606 moveto ( _ )show 18 594 moveto ( preceeding StartEvent and serves as a check on the functioning of the)show 18 582 moveto ( \(buffered\) ROC. The w field is a count of the words emitted by the ROC. It)show 18 582 moveto ( _ )show 18 570 moveto ( should thus be one greater than the number of DataWords in the SubEvent. )show 18 558 moveto ()show 18 546 moveto ( DataWord )show 18 546 moveto ( ________ )show 18 534 moveto ( )show 18 522 moveto ( 2 14 16 )show 18 510 moveto ( +-+-+------------+----------------+ )show 18 498 moveto ( | q | address | data | )show 18 486 moveto ( +-+-+------------+----------------+ )show 18 474 moveto ( )show 18 462 moveto ( The q field contains pileup qualifier bits from VXI cards. )show 18 462 moveto ( _ )show 18 450 moveto ()show 18 438 moveto ( The address field labels the VXI ADC which sourced the data. We have)show 18 438 moveto ( _______ )show 18 426 moveto ( structured the address fields into a Group field g, and an Item field i. )show 18 426 moveto ( _ _ )show 18 414 moveto ( )show 18 402 moveto ( 6 8 )show 18 390 moveto ( +----+-------+ )show 18 378 moveto ( | i | g | )show 18 366 moveto ( +----+-------+ )show 18 354 moveto ()show 18 342 moveto ( A Group consists of all the data from a Germanium detector and its associated)show 18 330 moveto ( shield detectors, using the Item field to distinguish between individual ADCs.)show 18 318 moveto ( Typically we would have i in the range 0,1,2,...,9 and g in the range)show 18 306 moveto ( 1,2,...,70. Values of i and g that clash with corresponding fields in non)show 18 294 moveto ( DataWords must be avoided when the VXI ADC address registers are loaded. )show 18 282 moveto ()show 18 270 moveto ( StartToken word )show 18 270 moveto ( _______________ )show 18 258 moveto ( )show 18 246 moveto ( 2 6 8 16 )show 18 234 moveto ( +-+-----+--------+----------------+ )show 18 222 moveto ( |3| @3D | @FF | @FFFF | )show 18 210 moveto ( +-+-----+--------+----------------+ )show 18 198 moveto ()show 18 186 moveto ( This word is placed in the data stream when data collection is enabled. |)show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( StopToken word )show 18 774 moveto ( ______________ )show 18 762 moveto ( )show 18 750 moveto ( 2 6 8 16 )show 18 738 moveto ( +-+-----+--------+----------------+ )show 18 726 moveto ( |3| @3C | @FF | @FFFF | )show 18 714 moveto ( +-+-----+--------+----------------+ )show 18 702 moveto ()show 18 690 moveto ( This word is placed in the data stream when data collection has been disabled |)show 18 678 moveto ( and all partially read out events have been flushed from ROC buffers. |)show 18 666 moveto ()show 18 654 moveto ( Trigger unit datawords )show 18 654 moveto ( ______________________ )show 18 642 moveto ()show 18 630 moveto ( The Trigger unit furnishes several parameters relating to each event as a |)show 18 618 moveto ( whole. These appear on the DT32 bus as components of the SubEvent generated by |)show 18 606 moveto ( the ROC in the crate occupied by the trigger unit. |)show 18 594 moveto ()show 18 582 moveto ()show 18 570 moveto ()show 18 558 moveto ()show 18 546 moveto ()show 18 534 moveto ()show 18 522 moveto ()show 18 510 moveto ()show 18 498 moveto ()show 18 486 moveto ()show 18 474 moveto ()show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Options for the EbyE pipeline architecture )show 18 750 moveto ( __________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Friday 3 May 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Here are two possibilities for rethinking the EuroGam EbyE pipeline. Both)show 18 654 moveto ( schemes assume that *all* event filtering and routing before writing to tape)show 18 642 moveto ( are done in the Event Buider. The French have insisted on a filtering and)show 18 630 moveto ( routing capability in the EB and I would argue that this obviates any)show 18 618 moveto ( equivalent capability in the Sorter. The Sorter then becomes an *optional*)show 18 606 moveto ( system component for those users who require sophisticated online)show 18 594 moveto ( histogramming by software. There is no *logical* requirement for the sorting)show 18 582 moveto ( component to process all the EbyE data, so it just samples as much as it can.)show 18 570 moveto ( This simplifies the design of the sorter and frees some VMEbus bandwidth in)show 18 558 moveto ( the Sorter crate for bulk memory increments. The EB performs data formatting,)show 18 546 moveto ( and optional event filtering, gain-matching, shared suppression, and event)show 18 534 moveto ( routing. )show 18 522 moveto ()show 18 510 moveto ( Option 1 )show 18 510 moveto ( ________ )show 18 498 moveto ()show 18 486 moveto ( In option 1 the Sorter acts as a spy on the DT32 readout bus. Data can enter)show 18 474 moveto ( the crate via an HSM module as envisaged for the EB, but it acts purely as a)show 18 462 moveto ( spy and takes no part in DT32bus flow control. Alternatively, data can enter)show 18 450 moveto ( by an adaptation of Jim Thornhill's design for the histogrammer board data)show 18 438 moveto ( capture. The Sorter can be seen as a means of doing more complicated)show 18 426 moveto ( histogramming than the hardware histogrammer is capable of. Both components)show 18 414 moveto ( have the same status within the EG architecture. )show 18 402 moveto ()show 18 390 moveto ( Component 'A' in the diagram is essentially an adaptor between an Optical Data)show 18 378 moveto ( Link \(ODL\) and the Fast Parallel Interface \(FPI\) needed to get EbyE data into)show 18 366 moveto ( the tape-serving GEC. It is essentially a British solution to a British)show 18 354 moveto ( problem. It consists of a small VME crate containing an ODL, a FIC, and)show 18 342 moveto ( Patrick's FPI card, which can be hidden in the NNGA cabinetry. Its software is)show 18 330 moveto ( minimal---just enough to provide bi-directional data transfer. Patrick and I)show 18 318 moveto ( think this can be done using the FIC's DMA engine to move data between the ODL)show 18 306 moveto ( and FPI directly without buffering or VMEbus cycles. Box A can be thought of)show 18 294 moveto ( as a black box solution to a purely electrical problem. It contains no)show 18 282 moveto ( communications protocols and is intended to be transparent to the EB and NNGA)show 18 270 moveto ( software which has to be responsible for dealing with all end-to-end)show 18 258 moveto ( communications issues. )show 18 246 moveto ()show 18 234 moveto ( Option 2 )show 18 234 moveto ( ________ )show 18 222 moveto ()show 18 210 moveto ( Option 2 is offered for those who can't stomach putting the Sorter on the)show 18 198 moveto ( DT32bus. The price is a more complicated ODL<-->FPI adaptor. FIC memory is)show 18 186 moveto ( used to buffer data between the ODL and FPI without consuming VMEbus cycles,)show 18 174 moveto ( but VMEbus \(possibly VSBbus\) cycles *are* consumed in moving data from FIC)show 18 162 moveto ( memory to slave processor memory. )show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Pros and Cons )show 18 774 moveto ( _____________ )show 18 762 moveto ()show 18 750 moveto ( Both options are conceptually simpler than a solution which places the Sorter)show 18 738 moveto ( in series with the EB and requires it to process *all* data emited by the EB. )show 18 726 moveto ()show 18 714 moveto ( It's not essential to use VSB to extend the Sorter crate data transfer)show 18 702 moveto ( capacity and so it's easier to fill all available slots with slave processors.)show 18 690 moveto ()show 18 678 moveto ( Pro option 1: )show 18 666 moveto ()show 18 654 moveto ( o it's simpler )show 18 642 moveto ()show 18 630 moveto ( o it's easier to operate the Sorter in the Strasburg environment \(for those)show 18 618 moveto ( users who require it\) since it's completely isolated from the Strasburg)show 18 606 moveto ( EB-->tape data path, unlike option 2. )show 18 594 moveto ()show 18 582 moveto ( o the Sorter and the ODL<-->FPI adaptor are well-separated development)show 18 570 moveto ( projects resulting in independent system components. )show 18 558 moveto ()show 18 546 moveto ( Pro option 2: )show 18 534 moveto ()show 18 522 moveto ( o the Sorter does not duplicate work \(possibly\) done in the EB such as)show 18 510 moveto ( gain-matching and filtering. )show 18 498 moveto ()show 18 486 moveto ()show 18 474 moveto ()show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Locating EuroGam Objects )show 18 750 moveto ( ________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Friday 17 May 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Introduction )show 18 666 moveto ( ____________ )show 18 654 moveto ()show 18 642 moveto ( This paper addresses some of the problems inherent in the client-server)show 18 630 moveto ( architecture we have chosen for EG, particularly problems associated with)show 18 618 moveto ( locating servers for particular objects on the local network. )show 18 606 moveto ()show 18 594 moveto ( We have be careful about distinctions between 'resources', 'servers', and)show 18 582 moveto ( 'objects' for there are subtle variations among the ways these concepts are)show 18 570 moveto ( expected to behave. For example, we see a VXI crate register server as a)show 18 558 moveto ( resource protected by a capability and supporting a large number of objects)show 18 546 moveto ( \(the registers\) all sharing the same capability. On the other hand, a tape)show 18 534 moveto ( server manages a small set of resources \(the tape drives\) each protected by)show 18 522 moveto ( its own capability. In addition a tape server has to provide a 'tape)show 18 510 moveto ( allocation status' service so that clients can find out what drives are)show 18 498 moveto ( available, but this service hardly needs protection by means of capabilities.)show 18 486 moveto ( On the third hand \(!\) a disc spectrum server would \(surely?\) use the unix)show 18 474 moveto ( filing system access protection mechanisms rather than capabilities. )show 18 462 moveto ()show 18 450 moveto ( Resources )show 18 450 moveto ( _________ )show 18 438 moveto ()show 18 426 moveto ( In general we see a 'resource' as a piece of hardware together with its)show 18 414 moveto ( associated software server, though there are instances \(disc spectra for)show 18 402 moveto ( example\) where the resource is almost entirely software. )show 18 390 moveto ()show 18 378 moveto ( From a client's point of view a resource is just a UDP address \(ie, an IP)show 18 366 moveto ( address identifying a host computer together with a port number identifying a)show 18 354 moveto ( software subsystem within that machine\). Usually we protect against)show 18 342 moveto ( interference between clients by means of capabilities, so clients must be able)show 18 330 moveto ( to associate capabilities with resources. A client can exploit a resource)show 18 318 moveto ( provided it knows its UDP address and a valid capability. Examples of)show 18 306 moveto ( resources include: VXI crate register servers, EventBuilder server,)show 18 294 moveto ( Histogrammer server, Sort server, Autofill server, tape drives. )show 18 282 moveto ()show 18 270 moveto ( Use of UDP port numbers allows us to put as many resource servers as we need)show 18 258 moveto ( into a single host. For example, it may be desirable to keep support for VXI)show 18 246 moveto ( card inspection point monitoring well separated from reading and writing VXI)show 18 234 moveto ( registers, especially if they turn out to need rather different RPC)show 18 222 moveto ( repertoires. )show 18 210 moveto ()show 18 198 moveto ( Experiments )show 18 198 moveto ( ___________ )show 18 186 moveto ()show 18 174 moveto ( The need to support access to the EG data acquisition hardware from multiple)show 18 162 moveto ( client workstations seems to lead inevitably to the idea of a 'capability)show 18 150 moveto ( file' containing the current resource address and capability associations for)show 18 138 moveto ( an experiment. Something like this appears to be so fundamental to making the)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( client-server model work that we will formalise the concept as outlined in)show 18 762 moveto ( what follows. )show 18 750 moveto ()show 18 738 moveto ( Before they can start using the data acquisition hardware a user group will be)show 18 726 moveto ( required to register an 'experiment'. This will involve supplying an arbitrary)show 18 714 moveto ( name \(and possibly a password\) and will result in the creation of a)show 18 702 moveto ( subdirectory of that name in some directory \(/eurogam/experiments, say\))show 18 690 moveto ( accessible to all client workstations. For concreteness let's suppose they)show 18 678 moveto ( choose 'dy152', say, as their experiment name. We can record the capabilities)show 18 666 moveto ( associated with the experiment in the file )show 18 654 moveto ()show 18 642 moveto ( /eurogam/experiments/dy152/capabilities )show 18 630 moveto ()show 18 618 moveto ( and some sort of 'run-book' style logging information in the file )show 18 606 moveto ()show 18 594 moveto ( /eurogam/experiments/dy152/log )show 18 582 moveto ()show 18 570 moveto ( Having a standard directory for experiment related files will no doubt prove)show 18 558 moveto ( valuable in supporting client applications---it's somewhere to record sorting)show 18 546 moveto ( configurations for example. The experiment name is entirely at the discretion)show 18 534 moveto ( of the users---there is no requirement that it be related to accelerator)show 18 522 moveto ( scheduling, experimental proposals, or created in advance by the system)show 18 510 moveto ( administrator. )show 18 498 moveto ()show 18 486 moveto ( Having established an experiment it's now straightforward for the user group)show 18 474 moveto ( to access the same resources from a second \(or third...\) workstation just by)show 18 462 moveto ( 'signing on' to the experiment, ie, by submitting the experiment name \(and)show 18 450 moveto ( possibly password\). Any resource claimed by one client workstation and)show 18 438 moveto ( recorded in the experiment's capability file automatically becomes available)show 18 426 moveto ( to all clients signed on to the experiment. )show 18 414 moveto ()show 18 402 moveto ( Registering or signing on to an experiment results in the recording of the)show 18 390 moveto ( experiment name in a reserved environment variable. This variable will be)show 18 378 moveto ( referenced by client library routines that need to locate resource servers via)show 18 366 moveto ( the capability file. All such library routines are thus implicitly)show 18 354 moveto ( parameterised by the experiment name so the user is effectively limited to)show 18 342 moveto ( accessing just one experiment at a time. )show 18 330 moveto ()show 18 318 moveto ( Configurations )show 18 318 moveto ( ______________ )show 18 306 moveto ()show 18 294 moveto ( Having setup a framework in which resource addresses and capabilities can be)show 18 282 moveto ( recorded we now need a means of determining precisely which of the resources)show 18 270 moveto ( that might be available are required in order to take data. An obvious way to)show 18 258 moveto ( do this is to record the names and addresses of a set of resources comprising)show 18 246 moveto ( a viable data acquisition system in some sort of 'configuration' file. Knowing)show 18 234 moveto ( the kind of experiment they wish to do a user group selects one of a set of)show 18 222 moveto ( configurations prepared in advance and maintained by the system administrator.)show 18 210 moveto ( A client program can then process the chosen configuration file, acquiring)show 18 198 moveto ( capabilities for whatever resources it needs by RPCs on the corresponding)show 18 186 moveto ( servers, and recording their names, addresses, and capabilities in the)show 18 174 moveto ( experiment's capability file. )show 18 162 moveto ()show 18 150 moveto ( By 'viable data acquisition system' we mean a set of physically connected)show 18 138 moveto ( hardware components making up a working EbyE pipeline. Now that we have point)show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( to point links throughout, rather than a broadcast network, we really need to)show 18 762 moveto ( keep track of which components are connected to which, so maintaining the)show 18 750 moveto ( configuration files is a job for a system administrator. )show 18 738 moveto ()show 18 726 moveto ( In the light of this one might argue that allowing a choice of configurations)show 18 714 moveto ( is excessively generous, especially given the financial constraints on)show 18 702 moveto ( building components several-off. However, the ability to construct partial and)show 18 690 moveto ( rearranged configurations is very valuable when using production software in a)show 18 678 moveto ( development or testing environment. Under these circumstances the available)show 18 666 moveto ( hardware has to be partitioned amongst several developers/testers to enable)show 18 654 moveto ( work to proceed in parallel. Note also that the EbyE pipeline will be)show 18 642 moveto ( assembled differently at Strasburg \(how differently remains to be seen\) and we)show 18 630 moveto ( should seek to reduce the impact of this change on client software. This means)show 18 618 moveto ( that we shouldn't compile configuration data into programs! )show 18 606 moveto ()show 18 594 moveto ( There is also talk of providing a separate system for replaying EbyE tapes as)show 18 582 moveto ( soon as possible after they are written. This is the French 'quasi-online')show 18 570 moveto ( replay facility. One could operate this purely in batch mode in much the same)show 18 558 moveto ( way as we currently run NNGS, but a more interesting \(and more convenient?\))show 18 546 moveto ( possibility is to integrate it more fully into the environment seen from a)show 18 534 moveto ( workstation by providing an *interactive* offline replay facility. Such a)show 18 522 moveto ( system would be represented as a configuration comprising a sort server \(and)show 18 510 moveto ( probably a tape server\) which could be acquired if desired in addition to a)show 18 498 moveto ( data acquisition configuration, or used stand-alone. )show 18 486 moveto ()show 18 474 moveto ( Locating EG objects )show 18 474 moveto ( ___________________ )show 18 462 moveto ()show 18 450 moveto ( We can now begin to see how client libraries might go about locating servers)show 18 438 moveto ( for objects \(registers, spectra, tapedrives, etc\) in the data acquisition)show 18 426 moveto ( system. The first requirement is that all objects be identified by names)show 18 414 moveto ( following the unix file system conventions. Thus we might have: )show 18 402 moveto ( )show 18 390 moveto ( /hist/ge23 )show 18 378 moveto ( /frontend/ge23/polezero )show 18 366 moveto ( /autofill/manifold6/nextfilltime )show 18 354 moveto ( /builder/program )show 18 342 moveto ( /sort/gammagamma )show 18 330 moveto ( /tape/mth3 )show 18 318 moveto ( )show 18 306 moveto ( The leading component of each name is going to be used to find a server for)show 18 294 moveto ( the object from amongst the resources of the current experiment. )show 18 282 moveto ()show 18 270 moveto ( To make life nicer for application programs and user interfaces we will use)show 18 258 moveto ( the unix 'path' idea to provide default prefixes for names that don't begin)show 18 246 moveto ( with a '/' character. For example, the following application code: )show 18 234 moveto ( )show 18 222 moveto ( SetRegisterPath \("/frontend"\); )show 18 210 moveto ( WriteRegister \("ge23/polezero", 2.9\); )show 18 198 moveto ( )show 18 186 moveto ( has the same result as )show 18 174 moveto ( )show 18 162 moveto ( WriteRegister \("/frontend/ge23/polezero", 2.9\); )show 18 150 moveto ( )show 18 138 moveto ( One can extend the idea to support unix style 'search paths'. For example, )show 18 126 moveto ()show 18 114 moveto ( 3)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( )show 18 762 moveto ( SetSpectrumPath \("/hist:/sort:/home/users0/wc/spectra/run23"\); )show 18 750 moveto ( ReadSpectrum \("ge23",...\); )show 18 738 moveto ( )show 18 726 moveto ( looks in turn for /hist/ge23, /sort/ge23, and so on, until the spectrum is)show 18 714 moveto ( found, by analogy with the algorithm used by unix shells to resolve command)show 18 702 moveto ( names to executable files. This is useful but potentially dangerous! Note that)show 18 690 moveto ( the path prefix\(es\) are a property of the client application program, being)show 18 678 moveto ( lodged in character variables in the appropriate libraries. Unix style names)show 18 666 moveto ( are chosen, of course, to fit in with the need to refer to disc spectra held)show 18 654 moveto ( in the filestore. )show 18 642 moveto ()show 18 630 moveto ( Having expanded an object's name to its 'proper form\(s\)' library code can go)show 18 618 moveto ( about locating its server. The complication here is that the mapping from)show 18 606 moveto ( leading name component to server is potentially one-many. For example, objects)show 18 594 moveto ( with names of the form '/frontend/...' might reside in any of several frontend)show 18 582 moveto ( VXI crates. Moreover, frontend register requests using pattern matching are)show 18 570 moveto ( inherently ambiguous. To accommodate this problem we will give each server an)show 18 558 moveto ( extra attribute called its 'role'. For example, an experiment's capability)show 18 546 moveto ( file entry for a frontend register server resource might look like this: )show 18 534 moveto ( )show 18 522 moveto ( \(name vxi2regs\) )show 18 510 moveto ( \(role frontend\) )show 18 498 moveto ( \(type registerserver\) )show 18 486 moveto ( \(host nnvq\) )show 18 474 moveto ( \(ipaddress 12.34.56.78\) )show 18 462 moveto ( \(port 23\) )show 18 450 moveto ( \(capability 9876543210\) )show 18 438 moveto ( )show 18 426 moveto ( Hence to locate the object with proper name '/xyz/...' we first scan the)show 18 414 moveto ( capability file for a server with name 'xyz' \(this gives a bit more)show 18 402 moveto ( flexibility\) and if this fails \(which it usually will\) we RPC on all servers)show 18 390 moveto ( with role 'xyz' in turn until we locate the object. In the case of register)show 18 378 moveto ( objects defined by pattern matching we have to RPC on *all* servers whose)show 18 366 moveto ( names or roles match 'xyz'. )show 18 354 moveto ()show 18 342 moveto ( This general algorithm has to be modified somewhat for other classes of)show 18 330 moveto ( object. For example, library code locating a server to RPC on behalf of an)show 18 318 moveto ( application call )show 18 306 moveto ( )show 18 294 moveto ( SetTapePath \("/nnga"\); )show 18 282 moveto ( OpenTapeFile \("mth3","run23",...\); )show 18 270 moveto ( )show 18 258 moveto ( needs to use the full name of the object \('/nnga/mth3'\) to locate a server)show 18 246 moveto ( entry. This is because such objects are individually protected by)show 18 234 moveto ( capabilities. This particular call might find a capability file entry of the)show 18 222 moveto ( following form: )show 18 210 moveto ( )show 18 198 moveto ( \(name nnga/mth3\) )show 18 186 moveto ( \(role tapedrive\) )show 18 174 moveto ( \(type tapeserver\) )show 18 162 moveto ( \(host nnga\) )show 18 150 moveto ( \(ipaddress 23.45.67.89\) )show 18 138 moveto ( \(port 23\) )show 18 126 moveto ()show 18 114 moveto ( 4)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( \(capability 8765432109\) )show 18 762 moveto ( )show 18 750 moveto ( Such an entry would appear in the capability file as a result of a successful)show 18 738 moveto ( prior call of the form: )show 18 726 moveto ( )show 18 714 moveto ( SetTapePath \("/nnga"\); )show 18 702 moveto ( ClaimDrive \("mth3"\); )show 18 690 moveto ( )show 18 678 moveto ( which itself would resolve to an entry of the form: )show 18 666 moveto ( )show 18 654 moveto ( \(name nnga/tapes\) )show 18 642 moveto ( \(role tapeserver\) )show 18 630 moveto ( \(type tapeserver\) )show 18 618 moveto ( \(host nnga\) )show 18 606 moveto ( \(ipaddress 23.45.67.89\) )show 18 594 moveto ( \(port 23\) )show 18 582 moveto ( \(capability 0\) )show 18 570 moveto ( )show 18 558 moveto ( by scanning for the name 'nnga/tapes'. The zero capability here ensures free)show 18 546 moveto ( access for tape allocation status inquiries. An entry of this form would arise)show 18 534 moveto ( from the user group acquiring for their experiment a particular)show 18 522 moveto ( 'configuration' that included this \(unprotected\) resource. )show 18 510 moveto ()show 18 498 moveto ( Postscript )show 18 498 moveto ( __________ )show 18 486 moveto ()show 18 474 moveto ( Despite spending quite some time thinking about it I'm not sure I've got these)show 18 462 moveto ( ideas quite right yet, so do please feel free to pick holes in this and I will)show 18 450 moveto ( re-work the paper into a proper EG document later. )show 18 438 moveto ()show 18 426 moveto ( \(/egdocs/eg11\) )show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 5)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Fortran and C Compatibility for Application Libraries on SUNOS )show 18 750 moveto ( ______________________________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Monday 20 May 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Introduction )show 18 666 moveto ( ____________ )show 18 654 moveto ()show 18 642 moveto ( This paper looks at the degree of compatibility, or lack thereof, between the)show 18 630 moveto ( Fortran and C subroutine calling conventions on SUNOS. It makes some)show 18 618 moveto ( recommendations for the design of application subroutine libraries intended)show 18 606 moveto ( for linkage with both Fortran and C. I'm thinking here mainly in terms of)show 18 594 moveto ( libraries supporting remote procedure calls on data acquisition system)show 18 582 moveto ( components, but the remarks and conclusions apply generally too. )show 18 570 moveto ()show 18 558 moveto ( Main Incompatibilities )show 18 558 moveto ( ______________________ )show 18 546 moveto ()show 18 534 moveto ( o Both the C and Fortran compilers prefix an underscore to the names of all)show 18 522 moveto ( external symbols. In addition Fortran appends an underscore as well.)show 18 510 moveto ( Normally then, for Fortran to call a C function requires the C function)show 18 498 moveto ( name to carry a trailing underscore, though this can be obviated by a)show 18 486 moveto ( \(non-standard\) 'pragma' comment in the Fortran EXTERNAL declaration of the)show 18 474 moveto ( function. )show 18 462 moveto ()show 18 450 moveto ( o Fortran naturally calls by reference and C by value. A Fortran programmer)show 18 438 moveto ( can apply the \(non-standard\) pseudo-function %VAL to an argument to pass it)show 18 426 moveto ( by value and a C programmer can always pass the address of a variable by)show 18 414 moveto ( use of the ampersand operator. \(strictly ampersand only applies to)show 18 402 moveto ( 'lvalues'---you can't take the address of a constant, for example\) )show 18 390 moveto ()show 18 378 moveto ( o Fortran passes character string arguments by appending to the argument list)show 18 366 moveto ( an extra string length argument, but passed by value, not by reference. C)show 18 354 moveto ( takes no efforts to pass the string lengths but the usual convention in the)show 18 342 moveto ( C world is to use null-terminated character strings. )show 18 330 moveto ()show 18 318 moveto ( Conclusions )show 18 318 moveto ( ___________ )show 18 306 moveto ()show 18 294 moveto ( There will always be some irreducible clumsiness in using a library routine)show 18 282 moveto ( intended to be callable from both C and Fortran. Either the Fortran programmer)show 18 270 moveto ( has to use lots of %VAL or the C programmer lots of ampersands. Either the C)show 18 258 moveto ( programmer has to remember the trailing underscore on the routine name, or the)show 18 246 moveto ( Fortran programmer has to remember the pragmas. Dealing with string lengths in)show 18 234 moveto ( a common way seems to require an explicit string length argument \(passed by)show 18 222 moveto ( reference---another ampersand\) which isn't the conventional C way of doing)show 18 210 moveto ( things. All these quirks just promote programming mistakes. )show 18 198 moveto ()show 18 186 moveto ( My recommendation is that we design library subroutines to be conveniently)show 18 174 moveto ( callable from C using the common C conventions. It would seem at the moment)show 18 162 moveto ( that most of the application software will be written in C or C++. Users, too,)show 18 150 moveto ( are becoming familiar with C \(and C++\) these days. To accommodate the use of)show 18 138 moveto ( Fortran we can provide a thin interfacing library, written in C, that)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( translates Fortran style calls into our C library calls. This is a pretty)show 18 762 moveto ( straightforward job but can be given a low priority anyway. )show 18 750 moveto ()show 18 738 moveto ( Having decided on C as the principal implementation language it's worth)show 18 726 moveto ( establishing a few further conventions: )show 18 714 moveto ()show 18 702 moveto ( o make all routines integer functions returning OK \(0\) or ERROR \(-1\). Even)show 18 690 moveto ( seemingly trivial functions can be faulted because of network problems,)show 18 678 moveto ( server failures, etc. This style is common in the C/unix world. )show 18 666 moveto ()show 18 654 moveto ( o lodge any more specific error code in the library and provide an integer)show 18 642 moveto ( function for returning the latest non-zero error code at any moment. )show 18 630 moveto ()show 18 618 moveto ( o provide a function for translating a library-specific error code into an)show 18 606 moveto ( explanatory text string along the lines of the OS4000 GENERRMESS function. )show 18 594 moveto ()show 18 582 moveto ( o pass character string arguments as null-terminated strings as is)show 18 570 moveto ( conventional with C. A function returning a string should take a char*)show 18 558 moveto ( argument pointing to a buffer supplied by the calling code and should copy)show 18 546 moveto ( the returned null-terminated character string into this buffer, without)show 18 534 moveto ( regard for its size. The calling programmer is responsible for allocating a)show 18 522 moveto ( buffer large enough to hold the maximum sized string \(plus terminating)show 18 510 moveto ( null\). )show 18 498 moveto ()show 18 486 moveto ( o model functions for accessing file-like objects of unbounded size on the)show 18 474 moveto ( unix read function. The calling programmer passes a buffer and a maximum)show 18 462 moveto ( length of data he's prepared to accept. The actual length of returned data)show 18 450 moveto ( \(> or = 0\) is returned as the function value. An error condition appears as)show 18 438 moveto ( a negative function value in this case. )show 18 426 moveto ()show 18 414 moveto ( Examples )show 18 414 moveto ( ________ )show 18 402 moveto ()show 18 390 moveto ( A C application program calls a library function: )show 18 378 moveto ( )show 18 366 moveto ( extern int libfun \(int i, char *cp, float f\); )show 18 354 moveto ( if \(libfun \(2,"abc",23.4\)==ERROR\)\) {...} )show 18 342 moveto ()show 18 330 moveto ( The library function itself: )show 18 318 moveto ( )show 18 306 moveto ( #define OK 0 )show 18 294 moveto ( int libfun \(int i, char *cp, float f\) { )show 18 282 moveto ( printf \("%d, %s, %f\\n", i, cp, f\); )show 18 270 moveto ( return OK; )show 18 258 moveto ( } )show 18 246 moveto ( A Fortran program doing the same thing: )show 18 234 moveto ()show 18 222 moveto ( EXTERNAL LIBFUN )show 18 210 moveto ( INTEGER IERR )show 18 198 moveto ( CHARACTER*10 S )show 18 186 moveto ( S = 'abc' )show 18 174 moveto ( CALL LIBFUN \(2,S,3,23.4,IERR\) )show 18 162 moveto ( IF \(IERR.NE.0\) THEN ... )show 18 150 moveto ( ENDIF )show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Note that the explict return code argument saves Fortran programmers from)show 18 762 moveto ( having to declare INTEGER LIBFUN, say, which they will be loathe to do, but we)show 18 750 moveto ( are obliged to include an explicit string length argument to accommodate the)show 18 738 moveto ( case where S contains fewer significant characters than its size. )show 18 726 moveto ()show 18 714 moveto ( The Fortran/C interface library routine for LIBFUN: )show 18 702 moveto ( )show 18 690 moveto ( char s[STRINGMAX]; )show 18 678 moveto ( void libfun_ \(int *ip, char *sp, int *lp, float *fp, int *ierrp, int sl\) { )show 18 666 moveto ( strncpy \(s, sp, *lp\); s[*lp]=NULL; )show 18 654 moveto ( *ierrp = libfun \(*ip, s, *fp\); )show 18 642 moveto ( } )show 18 630 moveto ()show 18 618 moveto ( Note that the implicit argument 'sl' carrying the size of the CHARACTER*)show 18 606 moveto ( variable S is ignored, and that the interface library has to know the maximum)show 18 594 moveto ( size of the string arguments that may be passed :-\(. )show 18 582 moveto ()show 18 570 moveto ( \(/egdocs/eg12\) )show 18 558 moveto ()show 18 546 moveto ()show 18 534 moveto ()show 18 522 moveto ()show 18 510 moveto ()show 18 498 moveto ()show 18 486 moveto ()show 18 474 moveto ()show 18 462 moveto ()show 18 450 moveto ()show 18 438 moveto ()show 18 426 moveto ()show 18 414 moveto ()show 18 402 moveto ()show 18 390 moveto ()show 18 378 moveto ()show 18 366 moveto ()show 18 354 moveto ()show 18 342 moveto ()show 18 330 moveto ()show 18 318 moveto ()show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 3)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Implementing Selftest Procedures for EuroGam Crates )show 18 750 moveto ( ___________________________________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Tuesday 21 May 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( This paper makes some tentative suggestions for the implementation of test and)show 18 654 moveto ( diagnostic procedures within the EG data acquisition system. An earlier paper)show 18 642 moveto ( [1] describes a general structure into which diagnostics might be fitted, with)show 18 630 moveto ( emphasis on how the EbyE pipeline might be checked out stage by stage. This)show 18 618 moveto ( paper looks more closely at how software support for diagnostics can be)show 18 606 moveto ( integrated with the software structures designed for the normal operation of)show 18 594 moveto ( the system, and with the VxWorks executive. )show 18 582 moveto ()show 18 570 moveto ( In [1] we describe a testing regime which successively verifies EbyE pipeline)show 18 558 moveto ( components by working upstream from the tape subsystem to the frontend data)show 18 546 moveto ( acquisition cards. For each component this involves at the very least some)show 18 534 moveto ( basic static tests of functionality---typically data retention tests---that)show 18 522 moveto ( can be performed entirely within a single crate. In addition, we envisage)show 18 510 moveto ( checking out an as yet unverified component by injecting artificial data at a)show 18 498 moveto ( suitable point and observing the effects on already verified components)show 18 486 moveto ( downstream. This usually involves coordinated activity in at least two crates.)show 18 474 moveto ()show 18 462 moveto ( The software in each crate consists in part of one or more RPC server tasks)show 18 450 moveto ( providing control and inquiry functions over the state of the crate. The)show 18 438 moveto ( problem is to integrate test procedures with the normal functioning of the)show 18 426 moveto ( crate. One model for this is the 'diagnostic mode' provided on most modern)show 18 414 moveto ( computers: following some specific interrupt \(eg, keying BREAK or Stop-A\))show 18 402 moveto ( control of the processor is seized by code in PROM, the normal operating)show 18 390 moveto ( system is displaced, and a simple interactive program is run offering the user)show 18 378 moveto ( a choice of diagnostic procedures available in PROM. These procedures are)show 18 366 moveto ( usually destructive of the current main memory contents and the operating)show 18 354 moveto ( system has to be reloaded when testing is completed. Though useful, this is)show 18 342 moveto ( not quite what we want for EG crates. Firstly we want the possibility of)show 18 330 moveto ( invoking these procedures remotely from a workstation, not by having to press)show 18 318 moveto ( a VME-Reset button. Secondly, we want the tests to exploit and exercise the)show 18 306 moveto ( operational software in the crate wherever possible. )show 18 294 moveto ()show 18 282 moveto ( One way to achieve this is to incorporate the diagnostic code with the normal)show 18 270 moveto ( operation code and dynamically spawn a task to execute the chosen test in)show 18 258 moveto ( response to an RPC. Perhaps ideally we would like to dynamically load)show 18 246 moveto ( diagnostic programs as and when required but unfortunately VxWorks does not)show 18 234 moveto ( really support the loading and deletion of programs in the style of general)show 18 222 moveto ( purpose operating systems. However, by analogy with PROMed test programs,)show 18 210 moveto ( there is no great loss in preparing the code modules in advance and)show 18 198 moveto ( incorporating them into a crate's boot time code image. )show 18 186 moveto ()show 18 174 moveto ( We will need two remotely callable procedures: )show 18 162 moveto ( )show 18 150 moveto ( StartTest \(testname, parameters\) --> status )show 18 138 moveto ( StopTest \(testname\) --> status, results )show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ()show 18 762 moveto ( StartTest spawns a new VxWorks task to execute the test code. This ensures)show 18 750 moveto ( that the RPC server is free to respond to normal operation RPCs \(and)show 18 738 moveto ( StopTest!\) while the test is being performed. Several of the procedures in [1])show 18 726 moveto ( envisage long running tests injecting artificial data into the system, and for)show 18 714 moveto ( system commissioning in general we need a source of data of unlimited)show 18 702 moveto ( duration. All tests should therefore take a 'duration' parameter. Typically)show 18 690 moveto ( this determines how many repetitions of the basic test are to be performed)show 18 678 moveto ( \(possibly infinitely many times\). When the repeat count is exhausted the test)show 18 666 moveto ( task alerts its parent task using the VxWorks signal mechanism and exits \(ie,)show 18 654 moveto ( it deletes itself\). A subsequent StopTest call can then report completion of)show 18 642 moveto ( the test. Alternatively, a StopTest call occurring while the test task is)show 18 630 moveto ( still executing has to kill \(delete\) the task before it exits of its own)show 18 618 moveto ( volition. )show 18 606 moveto ()show 18 594 moveto ( Since each EG crate already contains a 'register server' with an RPC interface)show 18 582 moveto ( as outlined in [2] we can seek to provide RPCs for diagnostic tests through)show 18 570 moveto ( this interface. This can be done by defining some 'pseudo registers')show 18 558 moveto ( corresponding to the tests available in a crate and their parameters. For)show 18 546 moveto ( example, in a histogrammer crate we might have the following \(all integer)show 18 534 moveto ( valued\): )show 18 522 moveto ( )show 18 510 moveto ( test1.state )show 18 498 moveto ( test1.repeatcount )show 18 486 moveto ( test1.DT32word )show 18 474 moveto ( test1.result )show 18 462 moveto ()show 18 450 moveto ( Setting the register test1.state = GOING is equivalent to StartTest)show 18 438 moveto ( \(test1,...\) with parameters given by test1.repeatcount and test1.DT32word. The)show 18 426 moveto ( latter represents a value that this test writes repeatedly into the)show 18 414 moveto ( histogrammer card, simulating arrival of data over the DT32 bus. Setting)show 18 402 moveto ( test1.state = HALTED is equivalent to StopTest \(test1\) and its result can be)show 18 390 moveto ( obtained by reading the register test1.result. )show 18 378 moveto ()show 18 366 moveto ( With some exceptions, all the diagnostic tests we can envisage at present fit)show 18 354 moveto ( this model. The exceptions are those which demand larger amounts of parameter)show 18 342 moveto ( data or produce lots of result data. For example, exercising an Event Builder)show 18 330 moveto ( or Sorter might involve downloading a block of several hundreds of words)show 18 318 moveto ( representing one or more complete events before invoking the test and reading)show 18 306 moveto ( back a similar quantity of data to check results afterwards. This might be)show 18 294 moveto ( achieved by the test task reading and writing files over NFS \(the filenames)show 18 282 moveto ( would be set into string valued registers\) or, probably better, by extending)show 18 270 moveto ( the register type system to include arrays of simple types. )show 18 258 moveto ()show 18 246 moveto ( References )show 18 246 moveto ( __________ )show 18 234 moveto ()show 18 222 moveto ( [1] 'Diagnostic Procedures for EuroGam', David Brightly and Patrick)show 18 210 moveto ( Coleman-Smith, EDOC067, January 1991 )show 18 198 moveto ()show 18 186 moveto ( [2] 'EuroGam Frontend Crate Server', David Brightly, EDOC024, September 1990 )show 18 174 moveto ()show 18 162 moveto ( \(/egdocs/eg13\) )show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Integrating a DBMS with EuroGam )show 18 750 moveto ( _______________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Monday 4 June 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Introduction )show 18 666 moveto ( ____________ )show 18 654 moveto ()show 18 642 moveto ( Members of the UK Eurogam user community have intimated that the software)show 18 630 moveto ( support for EG should include a database management system \(DBMS\) of some sort)show 18 618 moveto ( [1]. The motivation for this appears to be threefold: firstly, a desire to)show 18 606 moveto ( make available for online access during an experiment information relating to)show 18 594 moveto ( detector performance and array geometry; secondly, to provide a means of)show 18 582 moveto ( recording parameters essential for the operation of the array, and in)show 18 570 moveto ( particular, the preferred bias voltages for Ge detectors; and thirdly, to)show 18 558 moveto ( provide the NSF detector support group with a means of maintaining a lifetime)show 18 546 moveto ( historical record of detector measurements and movements in and out of the EG)show 18 534 moveto ( array. )show 18 522 moveto ()show 18 510 moveto ( To some extent these proposals are in conflict with the distributed design for)show 18 498 moveto ( the EG system outlined in [2]. The guiding principle here is that knowledge)show 18 486 moveto ( and control of the data acquisition hardware is devolved to intelligent)show 18 474 moveto ( frontend crates rather than centralised in a single processor. )show 18 462 moveto ()show 18 450 moveto ( This paper attempts to resolve these conflicts to get the best of both worlds:)show 18 438 moveto ( a central repository of critical parameters together with distributed local)show 18 426 moveto ( control. )show 18 414 moveto ()show 18 402 moveto ( Compiling hardware configurations )show 18 402 moveto ( _________________________________ )show 18 390 moveto ()show 18 378 moveto ( In the EG system users access the data acquisition hardware through software)show 18 366 moveto ( components in each crate called 'servers'. These provide an interface that)show 18 354 moveto ( hides most of the details of the hardware---VME addresses, bit positions, etc.)show 18 342 moveto ( Instead, they refer to named abstract 'registers' \(and other object types such)show 18 330 moveto ( as spectra\) which model the actual hardware. In the case of the frontend VXI)show 18 318 moveto ( crates containing Ge and BGO cards all the required functionality can be)show 18 306 moveto ( provided through abstract registers holding simple integer, real and character)show 18 294 moveto ( string data. Users can control time windows, thresholds, gains, etc, by)show 18 282 moveto ( assigning values to suitably named regsisters. The problem for the crate)show 18 270 moveto ( servers is to decide what register names they should support and how they map)show 18 258 moveto ( onto actual hardware \(VME addresses, bit fields, etc\). This is determined by)show 18 246 moveto ( what modules are present in each crate, their types, and how they are)show 18 234 moveto ( connected via front panel sockets to the EG array. This information is)show 18 222 moveto ( relatively static, changing only when modules are moved or changed, or when)show 18 210 moveto ( the cabling is altered. This static information describing the hardware is to)show 18 198 moveto ( be contrasted with the highly dynamic values for windows, thresholds, gains,)show 18 186 moveto ( etc, which users can set into the hardware registers completely freely. Hence)show 18 174 moveto ( the crate servers are designed to build data structures representing hardware)show 18 162 moveto ( objects when they are booted and thereafter operate within a fixed hardware)show 18 150 moveto ( configuration. These data structures are built by compiling an ASCII)show 18 138 moveto ( 'configuration file' containing a human readable and editable description of)show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( the hardware \(generally in a 'keyword-value' format\). In the case of a VXI)show 18 762 moveto ( crate, additional information about the modules present in the crate is also)show 18 750 moveto ( available through the VXI auto-configuration mechanism. )show 18 738 moveto ()show 18 726 moveto ( Relational databases )show 18 726 moveto ( ____________________ )show 18 714 moveto ()show 18 702 moveto ( Most modern database systems conform to what has become known as the)show 18 690 moveto ( 'relational' data model. Data is stored in files or 'tables'. Each table)show 18 678 moveto ( consists of a number of 'rows' and each row consists of a number of 'fields'.)show 18 666 moveto ( There is a clear analogy with data laid out in regular rows and columns in)show 18 654 moveto ( tabular form as it might appear in a book. Within a table each row has the)show 18 642 moveto ( same structure as any other row, ie, the same number and type of fields.)show 18 630 moveto ( Usually there is also the requirement that each row be uniquely identified by)show 18 618 moveto ( the value\(s\) in some field \(or combination of fields\). This data is known as)show 18 606 moveto ( the row's 'key'. The usual modes of access to a table are either to retrieve a)show 18 594 moveto ( single row given its key, or to retrieve a set of rows whose fields satisfy)show 18 582 moveto ( some condition. The latter may well imply scanning through the whole table. )show 18 570 moveto ()show 18 558 moveto ( In designing a database according to these principles it helps to think of)show 18 546 moveto ( each row as representing some real world object or event. For example, a)show 18 534 moveto ( database for EuroGam might contain a table called 'germaniums' consisting of a)show 18 522 moveto ( row for each Ge detector. The fields in each row might contain the detector)show 18 510 moveto ( name \(obviously this field would form the key\), manufacturer, date of)show 18 498 moveto ( acquisition, dimensions, preferred bias voltage, and possibly other bits of)show 18 486 moveto ( information about the detector. Similarly, one might have another table,)show 18 474 moveto ( called 'positions', in which each row would contain fields describing the)show 18 462 moveto ( geometrical or mechanical properties of Ge detector positions within the EG)show 18 450 moveto ( array, such as the angle of its face's normal to the beamline and which liquid)show 18 438 moveto ( N2 autofill outlet fed it. To keep a complete historical log of the results of)show 18 426 moveto ( detector performance measurements one would have to define a \(fixed\) number of)show 18 414 moveto ( fields representing a single set of measurements and establish a table whose)show 18 402 moveto ( rows consisted of a detector name field, a date and time of measurement field,)show 18 390 moveto ( and the measurement fields themselves. The key for this table would have to)show 18 378 moveto ( consist of both the detector name field and the date/time field, since one)show 18 366 moveto ( would want to store more than one measurement set for any given detector, and)show 18 354 moveto ( a key consisting of just the detector name would not necessarily identify a)show 18 342 moveto ( unique row of the table. Again, a table for recording movements of detectors)show 18 330 moveto ( in and out of the EG array would contain rows keyed on array position and)show 18 318 moveto ( date/time, with each row recording which detector had been moved and whether)show 18 306 moveto ( into or out of the array. Note that one would not include a field in the)show 18 294 moveto ( 'positions' table to record which detector currently occupied each position,)show 18 282 moveto ( since this can be deduced from the 'movements' table by looking for the row)show 18 270 moveto ( representing the most recent movement into the given array position. To)show 18 258 moveto ( include such a field would violate a further principle of relational database)show 18 246 moveto ( design---don't store redundant information. )show 18 234 moveto ()show 18 222 moveto ( The INGRES relational DBMS )show 18 222 moveto ( __________________________ )show 18 210 moveto ()show 18 198 moveto ( DL has acquired a generous right-to-use licence for the SUNOS implementation)show 18 186 moveto ( of the INGRES database system via the so-called CHEST arrangements for)show 18 174 moveto ( software purchases within UK academia. It appears that we can operate as many)show 18 162 moveto ( databases on as many SUN systems as we wish for an almost negligible annual)show 18 150 moveto ( cost, so it makes sense for the EG project to experiment with the INGRES)show 18 138 moveto ( system before investigating other possibilities. )show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ()show 18 762 moveto ( I have installed the INGRES software on the NSF's SUN file server, nnsa, and)show 18 750 moveto ( arranged for access to the DBMS from three of our discless workstations. The)show 18 738 moveto ( INGRES package has a number of user interface tools that can be run on these)show 18 726 moveto ( workstations. These include: )show 18 714 moveto ()show 18 702 moveto ( o a 'query-by-forms' program which lets you make simple ad hoc inquiries and)show 18 690 moveto ( updates by editing on-screen forms laid out in rows and columns mimicing)show 18 678 moveto ( the underlying tabular structure of the data; )show 18 666 moveto ()show 18 654 moveto ( o an interpreter program for a query language based on the SQL standard that)show 18 642 moveto ( lets you construct procedures and screen layouts for more sophisticated)show 18 630 moveto ( inquiries needing access to several tables at once; )show 18 618 moveto ()show 18 606 moveto ( o subroutine libraries for database access from users' Fortran and C)show 18 594 moveto ( programs. )show 18 582 moveto ( All these tools provide ways of retrieving the rows of a table ordered)show 18 570 moveto ( according to selected fields, for example, ordered in descending order of a)show 18 558 moveto ( date/time field. )show 18 546 moveto ()show 18 534 moveto ( One of the benefits of using a DBMS is that it provides what may be called)show 18 522 moveto ( 'controlled editing'. Users can browse and possibly alter data files, but the)show 18 510 moveto ( DBMS imposes restrictions on who can see and change files and ensures that)show 18 498 moveto ( alterations leave the files consistent---a field that is supposed to contain a)show 18 486 moveto ( detector name can be constrained to do so, for example. This should be)show 18 474 moveto ( contrasted with unconstrained editing of free format ASCII files which is the)show 18 462 moveto ( only practical alternative to use of a DBMS package. I can't recommend)show 18 450 moveto ( expending effort developing some homegrown software that falls between these)show 18 438 moveto ( two stools. In other words---it's INGRES or nothing. )show 18 426 moveto ()show 18 414 moveto ( Integrating INGRES with the crate server concept )show 18 414 moveto ( ________________________________________________ )show 18 402 moveto ()show 18 390 moveto ( The attached diagram gives a general picture of how this can be done. We don't)show 18 378 moveto ( have software for directly accessing INGRES from a VxWorks system so the)show 18 366 moveto ( information has to be transferred in two steps. The first step involves)show 18 354 moveto ( abstracting from the EG database the information needed to construct the)show 18 342 moveto ( configuration files needed by the crate servers. This can be done quite)show 18 330 moveto ( straightforwardly using the INGRES 'report generator' tool driven by a)show 18 318 moveto ( pre-prepared script. The second step just involves stimulating each EG crate)show 18 306 moveto ( to compile its internal data structures from the appropriate configuration)show 18 294 moveto ( file \(reading the file via NFS, of course\). The diagram also shows the)show 18 282 moveto ( possibility of creating or modifying configuration files simply by)show 18 270 moveto ( text-editing them. This is valuable not only during development---when you're)show 18 258 moveto ( working on VxWorks crate software you don't want the added hassle of dealing)show 18 246 moveto ( with INGRES---but also for the non-Daresbury phase of EG operations when the)show 18 234 moveto ( INGRES DBMS may not be available at all and direct text editing of)show 18 222 moveto ( configuration files may be the only resort. )show 18 210 moveto ()show 18 198 moveto ( This scheme can also be made to support what might be called 'incremental')show 18 186 moveto ( re-configurations of the EG hardware. In the original concept of static)show 18 174 moveto ( configurations any changes made to the hardware implied re-initialising all)show 18 162 moveto ( crate server software and consequent loss of current settings for thresholds,)show 18 150 moveto ( gains, etc, unless explicitly saved beforehand by the user. This would be)show 18 138 moveto ( roughly equivalent to 'freeing' and 'reclaiming' an Event Manager in the)show 18 126 moveto ()show 18 114 moveto ( 3)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( present NSF system. This is not as nice as it might be: a typical)show 18 762 moveto ( configuration change during an experiment might be simply to disconnect a)show 18 750 moveto ( detector from its acquisition or HV channel if either were suspect, and)show 18 738 moveto ( reconnect it to a spare. Only data structures associated with this detector)show 18 726 moveto ( position \(and not all of these\) would require modification, so I call this an)show 18 714 moveto ( 'incremental' configuration change. )show 18 702 moveto ()show 18 690 moveto ( The following algorithm handles this situation: we start with a configuration)show 18 678 moveto ( C from which we have derived a dictionary D mapping register names r to data)show 18 666 moveto ( structures s which hold the hardware details of the registers. We also have a)show 18 654 moveto ( current value V\(r\) for each register r in dom D. We are going to transform D)show 18 642 moveto ( to D', the dictionary that corresponds to an updated configuration C', and if)show 18 630 moveto ( a register appears in both D and D' we want to preserve its value. )show 18 618 moveto ()show 18 606 moveto ( 1 mark all elements of the dictionary D )show 18 594 moveto ( 2 compile the new configuration C' emitting elements r'-->s' in )show 18 582 moveto ( some order. For each element we have a case analysis: )show 18 570 moveto ( )show 18 558 moveto ( 2.1 r' not in dom D. This means that C' uses hardware not mentioned )show 18 546 moveto ( in C. Just append r'-->s' to D unmarked. )show 18 534 moveto ( 2.2 r'=r is in dom D and s'=D\(r\). This means that the change to C' )show 18 522 moveto ( does not affect the register r. Just unmark r-->s. )show 18 510 moveto ( 2.3 r'=r is in dom D but s' != D\(r\). This means that register r is )show 18 498 moveto ( affected by the change. Take the current value of r, V\(r\), )show 18 486 moveto ( remove r-->s from D, insert r'-->s' into D unmarked, and )show 18 474 moveto ( assign V\(r'\):=V\(r\). )show 18 462 moveto ( )show 18 450 moveto ( 3 finally, remove all marked elements r-->s left in D. These )show 18 438 moveto ( represent hardware components appearing in C but not in C'. )show 18 426 moveto ( We have now transformed D into D'. )show 18 414 moveto ()show 18 402 moveto ( The virtue of this approach is that we do not have to identify some set of)show 18 390 moveto ( anticipated configuration change 'modes'---substituting a spare detector for a)show 18 378 moveto ( damaged one, for example. A change can be recorded by updating the appropriate)show 18 366 moveto ( EG database table\(s\), deriving new configuration files from the modified)show 18 354 moveto ( database, and finally persuading the crate servers to perform the above)show 18 342 moveto ( algorithm. )show 18 330 moveto ()show 18 318 moveto ( References )show 18 318 moveto ( __________ )show 18 306 moveto ()show 18 294 moveto ( [1] 'Eurogam Database Requirements', Mike Bentley, January 1991, EDOC066 )show 18 282 moveto ()show 18 270 moveto ( [2] 'Overview of Eurogam Data Acquisition System', Vic Pucknell, July 1990,)show 18 258 moveto ( EDOC015 )show 18 246 moveto ()show 18 234 moveto ( \(/egdocs/eg14\) )show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 4)show showpage /Courier findfont 10 scalefont setfont 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( NSF Software Systems Group---Eurogam Project )show 18 774 moveto ( ____________________________________________ )show 18 762 moveto ()show 18 750 moveto ( Event Builder User Interface )show 18 750 moveto ( ____________________________ )show 18 738 moveto ()show 18 726 moveto ( David Brightly )show 18 714 moveto ()show 18 702 moveto ( Monday 17 June 1991 )show 18 690 moveto ( +----------------------------------------------------------------------------+)show 18 678 moveto ()show 18 666 moveto ( Introduction )show 18 666 moveto ( ____________ )show 18 654 moveto ()show 18 642 moveto ( This paper makes some suggestions for the EuroGam Event Builder \(EB\) user)show 18 630 moveto ( interface, based on the 'register server' concept introduced in [1]. The basic)show 18 618 moveto ( idea is that EB operations are controlled by RPCs which inspect and assign)show 18 606 moveto ( values to named 'registers' or 'variables' supported by the EB. )show 18 594 moveto ()show 18 582 moveto ( Variables )show 18 582 moveto ( _________ )show 18 570 moveto ()show 18 558 moveto ( The EB has an input stream of EbyE data coming from the DT32 bus and four)show 18 546 moveto ( output streams of EbyE data going to tape. The transformation from input)show 18 534 moveto ( stream to output streams is determined by a down-loadable program. )show 18 522 moveto ()show 18 510 moveto ( We will need a set of variables for each output stream, N=1..4 \(initial values)show 18 498 moveto ( following EB startup are in parentheses\): )show 18 486 moveto ( )show 18 474 moveto ( outputN.state ENABLED or DISABLED \(DISABLED\) )show 18 462 moveto ( outputN.capability needed for NTS compliance \(0\) )show 18 450 moveto ( outputN.position needed for NTS compliance \(0\) )show 18 438 moveto ( outputN.records } \(0\) )show 18 426 moveto ( outputN.events } statistics for stream N \(0\) )show 18 414 moveto ( outputN.bytes } \(0\) )show 18 402 moveto ()show 18 390 moveto ( The output stream state variables control whether events constructed by the EB)show 18 390 moveto ( _____ )show 18 378 moveto ( program are actually transmitted to tape or not. The capability and position)show 18 378 moveto ( __________ ________)show 18 366 moveto ( variables are needed to conform to the Network Tape System \(NTS\) protocol)show 18 354 moveto ( described in [2]. The only aspect of this protocol that need concern the EB is)show 18 342 moveto ( the Write Data procedure. All drive allocation, file opening etc operations)show 18 342 moveto ( __________ )show 18 330 moveto ( will be done by RPCs from a user interface to the appropriate tape server, and)show 18 318 moveto ( the resulting capabilities handed to the EB from the user interface. The user)show 18 306 moveto ( interface has to make sure that the appropriate position variable is set to)show 18 294 moveto ( zero when it opens a file. Thereafter the EB must keep track of position)show 18 282 moveto ( within each file by incrementing outputN.position with each record written.)show 18 282 moveto ( ________________ )show 18 270 moveto ( This aside, it's best to think of the EB as dealing with infinite,)show 18 258 moveto ( unpunctuated input and output streams. )show 18 246 moveto ()show 18 234 moveto ( The input stream just needs some statistics variables: )show 18 222 moveto ( )show 18 210 moveto ( input.records } \(0\) )show 18 198 moveto ( input.events } statistics for input stream \(0\) )show 18 186 moveto ( input.bytes } \(0\) )show 18 174 moveto ()show 18 162 moveto ( We will need an EB state variable that controls the overall flow of data: )show 18 162 moveto ( _____ )show 18 150 moveto ( )show 18 138 moveto ( state GOING or HALTED \(HALTED\) )show 18 126 moveto ()show 18 114 moveto ( 1)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ()show 18 762 moveto ( When in the GOING state EbyE data arriving on the input stream is transformed)show 18 750 moveto ( by the EB program and any resulting data for stream N is output provided)show 18 738 moveto ( stream N is ENABLED. When in the HALTED state data on the DT32 bus is ignored)show 18 726 moveto ( and no output EbyE data transmitted. The transition from GOING-->HALTED)show 18 714 moveto ( initiated by a user interface setting state:=HALTED causes the EB to flush any)show 18 702 moveto ( pending data on enabled output streams. The user interface has to ensure that)show 18 690 moveto ( any upstream data buffers are drained into the EB before doing this else data)show 18 678 moveto ( may be lost. )show 18 666 moveto ()show 18 654 moveto ( Since the transition GOING-->HALTED can be extended in time it may be)show 18 642 moveto ( desirable to introduce a transitory state, HALTING. )show 18 630 moveto ()show 18 618 moveto ( A user interface will also want to ensure that state=HALTED \(or at least)show 18 606 moveto ( outputN.state=DISABLED\) before opening or closing files on stream N. The EB)show 18 594 moveto ( must be prepared to have its attempts to write data rejected if the user)show 18 582 moveto ( interface fails to get a tape stream into a suitable state for writing data. )show 18 570 moveto ()show 18 558 moveto ( We will need a variable which determines the EB data transformation procedure:)show 18 546 moveto ( )show 18 534 moveto ( program filename of loadable module \(null\) )show 18 522 moveto ()show 18 510 moveto ( Assigning a non-null filename to the program variable causes the EB to load)show 18 510 moveto ( _______ )show 18 498 moveto ( the code contained in the file. Assigning a null name to program causes the EB)show 18 498 moveto ( _______ )show 18 486 moveto ( to substitute a default procedure that accepts input data but generates no)show 18 474 moveto ( output. The EB will probably want to insist that state=HALTED before allowing)show 18 462 moveto ( assignment to program. )show 18 462 moveto ( _______ )show 18 450 moveto ()show 18 438 moveto ( Error handling )show 18 438 moveto ( ______________ )show 18 426 moveto ()show 18 414 moveto ( One of the jobs of the EB is to check the integrity of the incoming EbyE data)show 18 402 moveto ( stream. In normal operation a small enough fraction of bad data is usually)show 18 390 moveto ( acceptable \(various Event Manager timeout problems for example\) so we need to)show 18 378 moveto ( keep some statistics on frequencies of the various integrity checks. These)show 18 366 moveto ( variables should all have names ending in 'errors' so that they can be)show 18 354 moveto ( accessed by pattern matching. )show 18 342 moveto ( )show 18 330 moveto ( something-went-wrong-errors \(0\) )show 18 318 moveto ( another-thing-went-wrong-errors \(0\) )show 18 306 moveto ( etc-etc-etc-errors \(0\) )show 18 294 moveto ()show 18 282 moveto ( Non-continuable fault conditions occurring while processing EbyE data in)show 18 270 moveto ( state=GOING \(ie, asynchronously with user interface requests\) have to be)show 18 258 moveto ( reported via the central exception handling system \(to be defined\). This)show 18 246 moveto ( category includes rejected attempts to write output data, slave processor)show 18 234 moveto ( traps, other hardware fault conditions, and 'cannot happen!' logic errors.)show 18 222 moveto ( Since these fault conditions inevitably leave buffered data lying around the)show 18 210 moveto ( EB really needs to go into a special CRASHED state following their occurrence.)show 18 198 moveto ( From the CRASHED state the EB can only enter the HALTED state and this)show 18 186 moveto ( transition implies discarding the buffered data and reseting the buffer pools.)show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 2)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( Testing and debugging aids )show 18 774 moveto ( __________________________ )show 18 762 moveto ()show 18 750 moveto ( It's worth building in some debugging tools right from the beginning of the)show 18 738 moveto ( project. One possibility is to take a snapshot copies of the first blocks of)show 18 726 moveto ( EbyE data input and output \(on each stream\) following a HALTED-->GOING)show 18 714 moveto ( transition. Subsequently these copies can be accessed by a user interface by)show 18 702 moveto ( reading the 'buffer-valued' variables input.snapshot and outputN.snapshot. For)show 18 702 moveto ( ______________ ________________ )show 18 690 moveto ( XDR purposes 'buffers' are just variable length opaques. These snapshots are)show 18 678 moveto ( enormously valuable for convincing oneself about the correctness or otherwise)show 18 666 moveto ( of the raw and transformed data. )show 18 654 moveto ()show 18 642 moveto ( Another possibility is to download a predetermined block of raw DT32bus data)show 18 630 moveto ( \(by *writing* to input.snapshot perhaps\) and invoking a test procedure that)show 18 630 moveto ( ______________ )show 18 618 moveto ( applies the EB program to just this block. The resulting output data can read)show 18 606 moveto ( back from the outputN.snapshot buffers and checked against what is expected.)show 18 606 moveto ( ________________ )show 18 594 moveto ( Alternatively, one might make the EB software sensitive to a mode variable.)show 18 594 moveto ( ____ )show 18 582 moveto ( With mode=NORMAL the system does its normal job. With mode=TEST the EB behaves)show 18 570 moveto ( differently according to the settings of other as yet unspecified variables,)show 18 558 moveto ( Examples of the kinds of test procedures or modes that would be useful are)show 18 546 moveto ( briefly outlined in [4]. How they are implemented rather depends on the ease)show 18 534 moveto ( or otherwise of dovetailing these features with the detailed design of the)show 18 522 moveto ( main parts of the EB software. )show 18 510 moveto ()show 18 498 moveto ( Further suggestions for integrating testing procedures as variables with)show 18 486 moveto ( special semantics can be found in [5]. )show 18 474 moveto ()show 18 462 moveto ( For further study )show 18 462 moveto ( _________________ )show 18 450 moveto ()show 18 438 moveto ( 1. To achieve a data transfer rate of better than 512 kbyte per second over)show 18 426 moveto ( the NTS protocol we will have to use large records \(nearly 16 kbyte\) and)show 18 414 moveto ( multibuffering. Multibuffering can be obtained by allowing several Write Data)show 18 414 moveto ( __________)show 18 402 moveto ( remote procedure calls to be in progress simultaneously. The EB must use the)show 18 390 moveto ( transaction id field of the RPC protocol to distinguish the calls and manage)show 18 390 moveto ( ______________ )show 18 378 moveto ( its output buffer allocation. See [6] for more details. Note that the)show 18 366 moveto ( transaction id is not intended as a sequence number---the order of records in)show 18 366 moveto ( ______________ )show 18 354 moveto ( the tape file is determined by the block/record field of the Write Data)show 18 354 moveto ( ____________ __________)show 18 342 moveto ( procedure call. Some thought needs to be given to checking that both NTS)show 18 330 moveto ( client and server behave sensibly in the face of error conditions such as lost)show 18 318 moveto ( and out of sequence packets. However, we can expect these errors to occur very)show 18 306 moveto ( infrequently since the optical and FPI links envisaged offer reliable)show 18 294 moveto ( transmission, unlike Ethernet. )show 18 282 moveto ()show 18 270 moveto ( 2. Until recently I've assumed that the EbyE pipeline would operate in an)show 18 258 moveto ( 'interlocked' mode---if the data rate exceeds the maximum rate imposed by some)show 18 246 moveto ( bottleneck \(probably the tape system\) then the pipeline backs up and)show 18 234 moveto ( eventually the data acquisition pauses for lack of readout buffer space. This)show 18 222 moveto ( is how the current Event Managers are operated. However, other regimes are)show 18 210 moveto ( conceivable. One possibility is to run all EB output streams uninterlocked but)show 18 198 moveto ( prioritised. Under this scheme output buffers are dispatched in accordance)show 18 186 moveto ( with the priorities of the associated streams rather than on a FIFO basis. If)show 18 174 moveto ( a stream's output buffers fill up then events generated by the EB on that)show 18 162 moveto ( stream are simply discarded. This could be exploited to ensure that lower)show 18 150 moveto ( volume but high multiplicity data takes precedence over higher volume, low)show 18 138 moveto ( multiplicity data. A variant on this scheme is to operate the top priority)show 18 126 moveto ()show 18 114 moveto ( 3)show showpage 18 810 moveto ()show 18 798 moveto ()show 18 786 moveto ()show 18 774 moveto ( stream---the one carrying the most interesting data---in interlocked mode. In)show 18 762 moveto ( both cases statistics need to be kept so that users can see by how much they)show 18 750 moveto ( are overrunning the data acquisition system. The current Event Managers make)show 18 738 moveto ( audible bleeps when the readout system runs out of buffer space---this useful)show 18 726 moveto ( feedback may not be so easily contrived with an EB located in an Experimental)show 18 714 moveto ( Area. )show 18 702 moveto ()show 18 690 moveto ( 3. Do we provide for automatic tape swapping \(as done now at the NSF\) and if)show 18 678 moveto ( so how? )show 18 666 moveto ()show 18 654 moveto ( 4. Previous discussions have mentioned 'striping' \(distributing high volume)show 18 642 moveto ( EbyE output over two or more tapes\) and 'duplicating' \(writing the same event)show 18 630 moveto ( to two or more tapes\). Duplicating is best handled as a special tape server)show 18 618 moveto ( function \(like 'mirror' discs\) since this avoids transmitting the same data)show 18 606 moveto ( twice or more. This will involve some changes to the semantics of the NTS)show 18 594 moveto ( Allocate Drive procedure for associating a tape drive with a data stream.)show 18 594 moveto ( ______________ )show 18 582 moveto ( Striping can also be offered by the tape server or achieved in the)show 18 570 moveto ( EB---perhaps invoked by an extension to the syntax of the STREAMS statement)show 18 558 moveto ( allowing the user to give a list of stream numbers. It's hard to see how)show 18 546 moveto ( either of these features can be integrated satisfactorily with automatic tape)show 18 534 moveto ( swapping though. )show 18 522 moveto ()show 18 510 moveto ( References )show 18 510 moveto ( __________ )show 18 498 moveto ()show 18 486 moveto ( [1] 'EuroGam Frontend Crate Server', David Brightly, EDOC024, September 1990 )show 18 474 moveto ()show 18 462 moveto ( [2] 'Network Tape System', Vic Pucknell, EDOC067, April 1991 )show 18 450 moveto ()show 18 438 moveto ( [3] 'EuroGam Event Builder Software', John Cresswell, EDOC037, September 1990 )show 18 426 moveto ()show 18 414 moveto ( [4] 'Diagnostic Procedures for EuroGam', David Brightly and Patrick)show 18 402 moveto ( Coleman-Smith, EDOC067, January 1991 )show 18 390 moveto ()show 18 378 moveto ( [5] 'Implementing Selftest Procedures for EuroGam Crates', David Brightly,)show 18 366 moveto ( EG13, May 1991 )show 18 354 moveto ()show 18 342 moveto ( [6] 'Remote Procedure Call', Vic Pucknell, EDOC018, July 1990 )show 18 330 moveto ()show 18 318 moveto ( \(/egdocs/eg15\) )show 18 306 moveto ()show 18 294 moveto ()show 18 282 moveto ()show 18 270 moveto ()show 18 258 moveto ()show 18 246 moveto ()show 18 234 moveto ()show 18 222 moveto ()show 18 210 moveto ()show 18 198 moveto ()show 18 186 moveto ()show 18 174 moveto ()show 18 162 moveto ()show 18 150 moveto ()show 18 138 moveto ()show 18 126 moveto ()show 18 114 moveto ( 4)show showpage save % a preamble for PubDraw/vecps output using the crop=clip-to-canvas option in % PubDraw, for which vecps always seems to place the bottom left hand corner % of the diagram at the point (72,72) in the default postscript frame % DB April 1991 -72 -72 translate %!PS-Adobe-2.0 EPSF-2.0 %%Title: /tmp_mnt/nfs/nnsa/home/users1/wc/egdocs/egslide9.vec %%Creator: wc %%CreationDate: Thu Jul 11 19:04:30 1991 %%Pages: 1 %%BoundingBox: 72 72 666 918 %%EndComments /draw_initial_state save def /displaylistdict 80 dict def displaylistdict begin % catch nocurrentpoint error for: % pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq { pop 0 0 1 1 } { ncpoint } ifelse } bind def end /image_raster { % sw sh dw dh xs ys translate scale /sh exch def /sw exch def /imagebuf sw 7 add 8 idiv string def sw sh 1 [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop } image } bind def /m {moveto} bind def /l {lineto} bind def % pattern stuff /BPSIDE 32 def % pixels per pattern side /PATFREQ 3.0 def % pattern pixels per mm /drawpat_mat [PATFREQ 0 0 PATFREQ 0 0] def /drawpat_pw BPSIDE def % pattern pixel width /drawpat_ph BPSIDE def % pattern pixel height /drawpat_w drawpat_pw PATFREQ div def % pattern mm width /drawpat_h drawpat_ph PATFREQ div def % pattern mm height /drawpat_bs 1 def % pattern bits per pixel /savemat matrix def /topmat matrix def /patmat matrix def /start_display_list { 0 setlinecap 10 setmiterlimit } bind def /patpath { topmat setmatrix pathbbox % get lo - hi indecies /hy exch drawpat_h div floor cvi def /hx exch drawpat_w div floor cvi def /ly exch drawpat_h div floor cvi def /lx exch drawpat_w div floor cvi def lx 1 hx { drawpat_w mul ly 1 hy { drawpat_h mul exch dup 3 1 roll exch patmat currentmatrix pop translate drawpat_pw drawpat_ph drawpat_bs drawpat_mat drawpat_proc image patmat setmatrix } for pop } for } bind def /r {rmoveto} bind def /sp {x 0 rmoveto} bind def /rl {rlineto} bind def /onelet 1 string def % show a string /s { complex_color { { onelet exch 0 exch put gsave currentpoint newpath moveto onelet true charpath clip patpath grestore onelet stringwidth rmoveto } forall } { show } ifelse } bind def /box { newpath m l l l closepath } bind def /pix_to_units { 144 300 div mul } bind def /apix_to_units { 144 exch div mul } bind def /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 228 /ograve 229 /otilde 230 /registered 231 /scaron 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 242 /ydieresis 243 /zcaron 244 /Aacute ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /getfont { /f exch def f cvn where { begin f cvx cvn exec setfont end } { f 0 f length 3 sub getinterval (LocalFont) extend_font /LocalFont findfont /sz f f length 3 sub 3 getinterval cvi def [ sz 0 0 sz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gsave currentpoint currentlinewidth currentpoint newpath moveto 6 -3 roll setlinewidth 0 exch r 0 rl stroke setlinewidth m grestore } bind def /ss { currentpoint pop exch m } bind def /image_raster { % sw sh dw dh xs ys translate scale /sh exch def /sw exch def /imagebuf sw 7 add 8 idiv string def sw sh 1 [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop } image } bind def /leader_insert { /str exch def /sp1 exch def -1 0 { pop sp1 0 str ashow } for } bind def /nx { /x exch def } bind def 0. nx %%EndProlog %%Page: 1 1 gsave 2.83465 -2.83465 scale newpath 25.4 -25.4 moveto 0 -298.45 rlineto 209.55 0 rlineto 0 298.45 rlineto closepath clip 25.4 -323.85 translate topmat currentmatrix pop start_display_list % text 0 setgray /complex_color false def matrix currentmatrix [1 0 0 1 130.556 284.819] concat 25.4 144 div dup scale 0 0 m 26 ss 0.000 26.000 m (Helvetica036) getfont (David) s 9.984 nx sp (Brightly) s sp sp sp (May) s sp (1991) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 65.7013 272.796] concat 25.4 144 div dup scale 0 0 m 44 ss 0.000 44.000 m (Helvetica060) getfont (Options) s 16.641 nx sp (for) s sp (the) s sp (EbyE) s sp (Pipeline) s setmatrix % irpoly2 2 setlinejoin .2634 setlinewidth gsave newpath 213.36 113.623 m 233.68 113.623 l 233.68 128.863 l 213.36 128.863 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 218.44 119.38] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (Boot) s setmatrix % irpoly2 gsave newpath 47.9213 47.7523 m 88.9 47.7523 l 88.9 71.12 l 47.9213 71.12 l closepath stroke grestore % irpoly2 gsave newpath 22.5213 98.5523 m 63.5 98.5523 l 63.5 121.92 l 22.5213 121.92 l closepath stroke grestore % irpoly2 gsave newpath 152.061 98.5523 m 193.04 98.5523 l 193.04 121.92 l 152.061 121.92 l closepath stroke grestore % polyline2 gsave newpath 55.88 48.26 m 55.88 71.12 l stroke grestore % polyline2 gsave newpath 27.94 99.06 m 27.94 121.92 l stroke grestore % polyline2 gsave newpath 35.56 99.06 m 35.56 121.92 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 50.8 50.8] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (H) s 46 ss 0.000 46.000 m (S) s 74 ss 0.000 74.000 m (M) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 30.48 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (H) s 46 ss 0.000 46.000 m (S) s 74 ss 0.000 74.000 m (M) s setmatrix % irpoly2 gsave newpath 91.1013 98.5523 m 116.84 98.5523 l 116.84 121.92 l 91.1013 121.92 l closepath stroke grestore % polyline2 gsave newpath 99.06 99.06 m 99.06 121.92 l stroke grestore % polyline2 gsave newpath 109.22 99.06 m 109.22 121.92 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 93.98 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (O) s 46 ss 0.000 46.000 m (D) s 74 ss 0.000 74.000 m (L) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 101.6 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (F) s 46 ss 0.000 46.000 m (I) s 74 ss 0.000 74.000 m (C) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 111.76 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (F) s 46 ss 0.000 46.000 m (P) s 74 ss 0.000 74.000 m (I) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 165.1 106.68] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (nnga) s 6.656 nx sp (+) s 46 ss 0.000 46.000 m (tapes) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 63.5 55.88] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (slave) s 46 ss 0.000 46.000 m (processors) s setmatrix % polyline2 .5174 setlinewidth gsave newpath 30.48 101.6 m 30.48 27.94 l stroke grestore % polyline2 gsave newpath 30.48 58.42 m 48.26 58.42 l stroke grestore % polyline2 .2634 setlinewidth gsave newpath 55.88 99.06 m 55.88 121.92 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 58.42 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (O) s 46 ss 0.000 46.000 m (D) s 74 ss 0.000 74.000 m (L) s setmatrix % polyline2 .5174 setlinewidth gsave newpath 63.5 109.22 m 91.44 109.22 l stroke grestore % polyline2 gsave newpath 116.84 109.22 m 152.4 109.22 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 7.62 129.54] concat 25.4 144 div dup scale 0 0 m 24 ss 0.000 24.000 m (Helvetica032) getfont (option) s 8.875 nx sp (1) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 73.66 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (odl) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 129.54 104.14] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (fpi) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 33.02 30.48] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (DT32bus) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 40.64 106.68] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (EBF) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 91.44 91.44] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (A) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 48.26 73.66] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (sorter) s setmatrix % irpoly2 .2634 setlinewidth gsave newpath 152.738 182.541 m 193.717 182.541 l 193.717 205.909 l 152.738 205.909 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 168.317 190.669] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (nnga) s 6.656 nx sp (+) s 46 ss 0.000 46.000 m (tapes) s setmatrix % irpoly2 gsave newpath 86.6986 205.401 m 135.297 205.401 l 135.297 228.769 l 86.6986 228.769 l closepath stroke grestore % polyline2 gsave newpath 94.6573 205.909 m 94.6573 228.769 l stroke grestore % polyline2 gsave newpath 102.277 205.909 m 102.277 228.769 l stroke grestore % polyline2 gsave newpath 109.897 205.909 m 109.897 228.769 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 89.5773 210.989] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (O) s 46 ss 0.000 46.000 m (D) s 74 ss 0.000 74.000 m (L) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 97.1973 210.989] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (F) s 46 ss 0.000 46.000 m (I) s 74 ss 0.000 74.000 m (C) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 104.817 210.989] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (F) s 46 ss 0.000 46.000 m (P) s 74 ss 0.000 74.000 m (I) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 112.437 213.529] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (slave) s 46 ss 0.000 46.000 m (processors) s setmatrix % irpoly2 gsave newpath 23.1986 205.401 m 64.1773 205.401 l 64.1773 228.769 l 23.1986 228.769 l closepath stroke grestore % polyline2 gsave newpath 28.6173 205.909 m 28.6173 228.769 l stroke grestore % polyline2 gsave newpath 36.2373 205.909 m 36.2373 228.769 l stroke grestore % polyline2 gsave newpath 56.5573 205.909 m 56.5573 228.769 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 31.1573 210.989] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (H) s 46 ss 0.000 46.000 m (S) s 74 ss 0.000 74.000 m (M) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 59.0973 210.989] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (O) s 46 ss 0.000 46.000 m (D) s 74 ss 0.000 74.000 m (L) s setmatrix % polyline2 .5174 setlinewidth gsave newpath 31.1573 162.729 m 31.1573 208.449 l stroke grestore % polyline2 gsave newpath 64.1773 218.609 m 87.0373 218.609 l stroke grestore % polyline2 gsave newpath 104.817 208.449 m 104.817 193.209 l stroke grestore % polyline2 gsave newpath 104.817 193.209 m 153.077 193.209 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 10.8373 241.469] concat 25.4 144 div dup scale 0 0 m 24 ss 0.000 24.000 m (Helvetica032) getfont (option) s 8.875 nx sp (2) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 33.6973 165.269] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (DT32bus) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 71.7973 213.529] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (odl) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 125.137 188.129] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (fpi) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 41.3173 213.529] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (EBF) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 87.0373 231.309] concat 25.4 144 div dup scale 0 0 m 18 ss 0.000 18.000 m (Helvetica024) getfont (sorter) s setmatrix showpage grestore %%Trailer end draw_initial_state restore restore % a preamble for PubDraw/vecps output using the crop=clip-to-canvas option in % PubDraw, for which vecps always seems to place the bottom left hand corner % of the diagram at the point (72,72) in the default postscript frame % DB April 1991 % this one does landscape orientation on A4 paper save 90 rotate 0 -594 translate -72 -72 translate %!PS-Adobe-2.0 EPSF-2.0 %%Title: /home/users1/wc/egdocs/egslide8.vec %%Creator: wc %%CreationDate: Wed Jun 26 18:47:45 1991 %%Pages: 1 %%BoundingBox: 72 72 918 666 %%EndComments /draw_initial_state save def /displaylistdict 80 dict def displaylistdict begin % catch nocurrentpoint error for: % pathbbox /ncpoint errordict /nocurrentpoint get def errordict begin /nocurrentpoint { dup /pathbbox load eq { pop 0 0 1 1 } { ncpoint } ifelse } bind def end /image_raster { % sw sh dw dh xs ys translate scale /sh exch def /sw exch def /imagebuf sw 7 add 8 idiv string def sw sh 1 [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop } image } bind def /m {moveto} bind def /l {lineto} bind def % pattern stuff /BPSIDE 32 def % pixels per pattern side /PATFREQ 3.0 def % pattern pixels per mm /drawpat_mat [PATFREQ 0 0 PATFREQ 0 0] def /drawpat_pw BPSIDE def % pattern pixel width /drawpat_ph BPSIDE def % pattern pixel height /drawpat_w drawpat_pw PATFREQ div def % pattern mm width /drawpat_h drawpat_ph PATFREQ div def % pattern mm height /drawpat_bs 1 def % pattern bits per pixel /savemat matrix def /topmat matrix def /patmat matrix def /start_display_list { 0 setlinecap 10 setmiterlimit } bind def /patpath { topmat setmatrix pathbbox % get lo - hi indecies /hy exch drawpat_h div floor cvi def /hx exch drawpat_w div floor cvi def /ly exch drawpat_h div floor cvi def /lx exch drawpat_w div floor cvi def lx 1 hx { drawpat_w mul ly 1 hy { drawpat_h mul exch dup 3 1 roll exch patmat currentmatrix pop translate drawpat_pw drawpat_ph drawpat_bs drawpat_mat drawpat_proc image patmat setmatrix } for pop } for } bind def /r {rmoveto} bind def /sp {x 0 rmoveto} bind def /rl {rlineto} bind def /onelet 1 string def % show a string /s { complex_color { { onelet exch 0 exch put gsave currentpoint newpath moveto onelet true charpath clip patpath grestore onelet stringwidth rmoveto } forall } { show } ifelse } bind def /box { newpath m l l l closepath } bind def /pix_to_units { 144 300 div mul } bind def /apix_to_units { 144 exch div mul } bind def /reencode_small_dict 12 dict def /ReencodeSmall { reencode_small_dict begin /new_codes_and_names exch def /new_font_name exch def /base_font_name exch def /base_font_dict base_font_name findfont def /newfont base_font_dict maxlength dict def base_font_dict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName new_font_name put new_codes_and_names aload pop new_codes_and_names length 2 idiv { newfont /Encoding get 3 1 roll put } repeat new_font_name newfont definefont pop end %reencode_small_dict } def /extended_Zapf [ 8#223 /a89 8#224 /a90 8#225 /a93 8#226 /a94 8#227 /a91 8#230 /a92 8#231 /a205 8#232 /a85 8#233 /a206 8#234 /a86 8#235 /a87 8#236 /a88 8#237 /a95 8#240 /a96 ] def /extended_Standard [ 128 /Acircumflex 129 /Adieresis 130 /Agrave 131 /Aring 132 /Atilde 133 /Ccedilla 134 /Eacute 135 /Ecircumflex 136 /Edieresis 137 /Egrave 138 /Iacute 139 /Icircumflex 140 /Idieresis 141 /Igrave 142 /Ntilde 143 /Oacute 144 /Ocircumflex 145 /Odieresis 146 /Ograve 147 /Otilde 148 /Scaron 149 /Uacute 150 /Ucircumflex 151 /Udieresis 152 /Ugrave 153 /Ydieresis 154 /Zcaron 155 /aacute 156 /acircumflex 157 /adieresis 158 /agrave 159 /aring 160 /atilde 209 /ccedilla 210 /copyright 211 /eacute 212 /ecircumflex 213 /edieresis 214 /egrave 215 /iacute 216 /icircumflex 217 /idieresis 218 /igrave 219 /logicalnot 220 /minus 221 /ntilde 222 /oacute 223 /ocircumflex 224 /odieresis 228 /ograve 229 /otilde 230 /registered 231 /scaron 236 /trademark 237 /uacute 238 /ucircumflex 239 /udieresis 240 /ugrave 242 /ydieresis 243 /zcaron 244 /Aacute ] def /extended_Symbol [ ] def /extend_font { % stack: fontname newfontname exch dup (ZapfDingbats) eq { cvn exch cvn extended_Zapf ReencodeSmall } { dup (Symbol) eq { cvn exch cvn extended_Symbol ReencodeSmall } { cvn exch cvn extended_Standard ReencodeSmall } ifelse } ifelse } bind def /getfont { /f exch def f cvn where { begin f cvx cvn exec setfont end } { f 0 f length 3 sub getinterval (LocalFont) extend_font /LocalFont findfont /sz f f length 3 sub 3 getinterval cvi def [ sz 0 0 sz neg 0 0 ] makefont dup f cvn exch def setfont } ifelse } bind def /ul { % space drop thickness gsave currentpoint currentlinewidth currentpoint newpath moveto 6 -3 roll setlinewidth 0 exch r 0 rl stroke setlinewidth m grestore } bind def /ss { currentpoint pop exch m } bind def /image_raster { % sw sh dw dh xs ys translate scale /sh exch def /sw exch def /imagebuf sw 7 add 8 idiv string def sw sh 1 [sw 0 0 sh 0 0] { currentfile imagebuf readhexstring pop } image } bind def /leader_insert { /str exch def /sp1 exch def -1 0 { pop sp1 0 str ashow } for } bind def /nx { /x exch def } bind def 0. nx %%EndProlog %%Page: 1 1 gsave 2.83465 -2.83465 scale newpath 25.4 -25.4 moveto 0 -209.55 rlineto 298.45 0 rlineto 0 209.55 rlineto closepath clip 25.4 -234.95 translate topmat currentmatrix pop start_display_list % text 0 setgray /complex_color false def matrix currentmatrix [1 0 0 1 198.12 17.78] concat 25.4 144 div dup scale 0 0 m 26 ss 0.000 26.000 m (Helvetica036) getfont (David) s 9.984 nx sp (Brightly) s sp sp sp sp (May) s sp (1991) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 109.22 5.08] concat 25.4 144 div dup scale 0 0 m 44 ss 0.000 44.000 m (Helvetica060) getfont (Integrating) s 16.641 nx sp (a) s sp (DBMS) s sp (with) s sp (EuroGam) s setmatrix % irpoly2 2 setlinejoin .1 setlinewidth gsave newpath 33.02 32.3426 m 53.34 32.3426 l 53.34 47.5827 l 33.02 47.5827 l closepath stroke grestore % ellipse2 gsave matrix currentmatrix 96.52 78.74 translate 12.7 7.62 scale newpath 0 0 1 0 360 arc setmatrix closepath stroke grestore % polyline2 gsave newpath 63.5 60.96 m 83.82 60.96 l stroke grestore % polyline2 gsave newpath 63.5 58.42 m 83.82 58.42 l stroke grestore % polyline2 gsave newpath 137.16 96.52 m 157.48 96.52 l stroke grestore % polyline2 gsave newpath 137.16 93.98 m 157.48 93.98 l stroke grestore % polyline2 gsave newpath 111.76 96.52 m 132.08 96.52 l stroke grestore % polyline2 gsave newpath 111.76 93.98 m 132.08 93.98 l stroke grestore % ellipse2 gsave matrix currentmatrix 167.64 73.66 translate 12.7 7.62 scale newpath 0 0 1 0 360 arc setmatrix closepath stroke grestore % irpoly2 gsave newpath 203.2 52.6627 m 223.52 52.6627 l 223.52 67.9027 l 203.2 67.9027 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 35.56 35.56] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (user/) s 53 ss 0.000 53.000 m (admin) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 205.74 55.88] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (user/) s 53 ss 0.000 53.000 m (admin) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 88.9 73.66] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (derive) s 53 ss 0.000 53.000 m (config) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 162.56 68.58] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (edit) s 53 ss 0.000 53.000 m (config) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 86.36 55.88] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (INGRES) s 7.000 nx sp sp (database) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 160.02 91.44] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (configuration) s 53 ss 0.000 53.000 m (files) s setmatrix % bezier3 .2524 setlinewidth 1 setgray gsave newpath 53.34 38.1 m 59.2667 39.7933 67.31 39.7933 71.12 43.18 curveto 74.93 46.5667 74.5067 53.34 76.2 58.42 curveto eofill grestore % arrow 0 setgray gsave newpath 76.2 58.42 m 74.3456 55.5305 l 76.4502 54.9957 l closepath eofill grestore gsave newpath 53.34 38.1 m 59.2667 39.7933 67.31 39.7933 71.12 43.18 curveto 74.1817 45.9015 74.5097 50.8099 75.3991 55.2692 curveto stroke grestore % bezier3 1 setgray gsave newpath 71.12 60.96 m 71.9667 64.3467 71.5433 68.58 73.66 71.12 curveto 75.7767 73.66 80.4333 74.5067 83.82 76.2 curveto eofill grestore % arrow 0 setgray gsave newpath 83.82 76.2 m 80.3962 75.9432 l 81.2351 73.9403 l closepath eofill grestore gsave newpath 71.12 60.96 m 71.9667 64.3467 71.5433 68.58 73.66 71.12 curveto 75.1952 72.9622 78.0665 73.9137 80.8203 74.9435 curveto stroke grestore % bezier3 1 setgray gsave newpath 109.22 78.74 m 116.84 80.4333 126.153 81.28 132.08 83.82 curveto 138.007 86.36 140.547 90.5933 144.78 93.98 curveto eofill grestore % arrow 0 setgray gsave newpath 144.78 93.98 m 141.626 92.6244 l 143.07 91.0028 l closepath eofill grestore gsave newpath 109.22 78.74 m 116.84 80.4333 126.153 81.28 132.08 83.82 curveto 136.795 85.8405 139.366 88.9325 142.352 91.8175 curveto stroke grestore % bezier3 1 setgray gsave newpath 106.68 83.82 m 109.22 85.5133 112.607 87.2067 114.3 88.9 curveto 115.993 90.5933 115.993 92.2867 116.84 93.98 curveto eofill grestore % arrow 0 setgray gsave newpath 116.84 93.98 m 114.668 91.3209 l 116.698 90.5496 l closepath eofill grestore gsave newpath 106.68 83.82 m 109.22 85.5133 112.607 87.2067 114.3 88.9 curveto 114.98 89.5803 115.387 90.2606 115.685 90.941 curveto stroke grestore % bezier3 % arrow gsave newpath 124.46 93.98 m 125.917 90.871 l 127.491 92.3668 l closepath eofill grestore gsave newpath 154.94 76.2 m 149.86 77.0467 144.78 75.7767 139.7 78.74 curveto 135.367 81.2674 131.034 86.8744 126.702 91.6211 curveto stroke grestore % bezier3 1 setgray gsave newpath 160.02 78.74 m 157.48 80.4333 154.093 81.28 152.4 83.82 curveto 150.707 86.36 150.707 90.5933 149.86 93.98 curveto eofill grestore % arrow 0 setgray gsave newpath 149.86 93.98 m 149.394 90.5784 l 151.528 90.9791 l closepath eofill grestore gsave newpath 160.02 78.74 m 157.48 80.4333 154.093 81.28 152.4 83.82 curveto 151.213 85.6005 150.858 88.2131 150.461 90.7828 curveto stroke grestore % bezier3 % arrow gsave newpath 177.8 68.58 m 179.97 65.919 l 181.132 67.753 l closepath eofill grestore gsave newpath 203.2 58.42 m 198.967 59.2667 194.733 59.2667 190.5 60.96 curveto 187.183 62.2869 183.865 64.6537 180.548 66.8381 curveto stroke grestore % polyline2 .1 setlinewidth gsave newpath 142.24 149.86 m 162.56 149.86 l stroke grestore % polyline2 gsave newpath 142.24 147.32 m 162.56 147.32 l stroke grestore % ellipse2 gsave matrix currentmatrix 182.88 129.54 translate 12.7 7.62 scale newpath 0 0 1 0 360 arc setmatrix closepath stroke grestore % ellipse2 gsave matrix currentmatrix 116.84 134.62 translate 12.7 7.62 scale newpath 0 0 1 0 360 arc setmatrix closepath stroke grestore % polyline2 gsave newpath 73.66 160.02 m 93.98 160.02 l stroke grestore % polyline2 gsave newpath 73.66 157.48 m 93.98 157.48 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 175.26 124.46] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (VXI) s 7.000 nx sp (auto) s 53 ss 0.000 53.000 m (config) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 165.1 144.78] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (module) s 53 ss 0.000 53.000 m (table) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 109.22 129.54] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (compile) s 53 ss 0.000 53.000 m (config) s setmatrix % text /complex_color false def matrix currentmatrix [1 0 0 1 96.52 154.94] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (object) s 53 ss 0.000 53.000 m (dictionary) s setmatrix % bezier3 % arrow gsave newpath 157.48 147.32 m 157.833 143.905 l 159.811 144.799 l closepath eofill grestore .2524 setlinewidth gsave newpath 170.18 132.08 m 167.64 133.773 164.677 134.62 162.56 137.16 curveto 161.031 138.994 159.944 141.711 158.821 144.355 curveto stroke grestore % bezier3 % arrow gsave newpath 129.54 137.16 m 132.943 136.707 l 132.534 138.84 l closepath eofill grestore gsave newpath 147.32 147.32 m 144.78 144.78 142.663 141.393 139.7 139.7 curveto 137.644 138.525 135.18 138.166 132.733 137.773 curveto stroke grestore % bezier3 % arrow gsave newpath 83.82 157.48 m 84.2673 154.076 l 86.2203 155.025 l closepath eofill grestore gsave newpath 106.68 139.7 m 100.753 143.087 92.71 146.897 88.9 149.86 curveto 86.6133 151.638 85.8515 153.112 85.2418 154.555 curveto stroke grestore % irpoly2 .1 setlinewidth gsave newpath 213.36 113.623 m 233.68 113.623 l 233.68 128.863 l 213.36 128.863 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 218.44 119.38] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (Boot) s setmatrix % bezier3 % arrow gsave newpath 195.58 127 m 198.3 124.905 l 199.013 126.957 l closepath eofill grestore .2524 setlinewidth gsave newpath 213.36 121.92 m 209.973 122.767 206.163 123.613 203.2 124.46 curveto 201.483 124.951 200.051 125.441 198.655 125.931 curveto stroke grestore % bezier3 % arrow gsave newpath 119.38 127 m 118.89 123.602 l 121.027 123.988 l closepath eofill grestore gsave newpath 121.92 96.52 m 121.92 101.6 122.343 106.68 121.92 111.76 curveto 121.586 115.772 120.724 119.784 119.958 123.796 curveto stroke grestore % bezier3 % arrow gsave newpath 127 129.54 m 128.311 126.367 l 129.953 127.788 l closepath eofill grestore gsave newpath 147.32 96.52 m 144.78 102.447 143.087 108.797 139.7 114.3 curveto 136.866 118.904 132.847 122.916 129.131 127.079 curveto stroke grestore % irpoly2 .5 setgray gsave newpath 68.58 167.64 m 203.2 167.64 l 203.2 114.3 l 68.58 114.3 l closepath stroke grestore % text 0 setgray /complex_color false def matrix currentmatrix [1 0 0 1 165.1 162.56] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (per) s 7.000 nx sp (crate) s sp (activities) s setmatrix % irpoly2 .5 setgray gsave newpath 193.04 104.14 m 58.42 104.14 l 58.42 50.8 l 193.04 50.8 l closepath stroke grestore % text 0 setgray /complex_color false def matrix currentmatrix [1 0 0 1 60.96 96.52] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (global) s 7.000 nx sp (activities) s setmatrix % irpoly2 .5064 setlinewidth 1 setgray gsave newpath 22.86 185.42 m 43.18 185.42 l 43.18 195.58 l 22.86 195.58 l closepath eofill grestore 0 setgray gsave newpath 22.86 185.42 m 43.18 185.42 l 43.18 195.58 l 22.86 195.58 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 45.72 187.96] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (represents) s 7.000 nx sp (an) s sp (external) s sp (input) s setmatrix % polyline2 .1 setlinewidth gsave newpath 111.76 193.04 m 132.08 193.04 l stroke grestore % polyline2 gsave newpath 111.76 190.5 m 132.08 190.5 l stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 134.62 187.96] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (represents) s 7.000 nx sp (a) s sp (data) s sp (store) s setmatrix % ellipse2 .5064 setlinewidth 1 setgray gsave matrix currentmatrix 203.2 190.5 translate 10.16 5.08 scale newpath 0 0 1 0 360 arc setmatrix closepath eofill grestore 0 setgray gsave matrix currentmatrix 203.2 190.5 translate 10.16 5.08 scale newpath 0 0 1 0 360 arc setmatrix closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 215.9 187.96] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (represents) s 7.000 nx sp (a) s sp (procedure) s setmatrix % irpoly2 .1 setlinewidth gsave newpath 35.56 113.623 m 55.88 113.623 l 55.88 132.08 l 35.56 132.08 l closepath stroke grestore % text /complex_color false def matrix currentmatrix [1 0 0 1 38.1 114.3] concat 25.4 144 div dup scale 0 0 m 21 ss 0.000 21.000 m (Times-Italic028) getfont (user/) s 53 ss 0.000 53.000 m (admin/) s 85 ss 0.000 85.000 m (boot) s setmatrix % bezier3 .2524 setlinewidth 1 setgray gsave newpath 55.88 121.92 m 67.7333 122.767 82.9733 123.19 91.44 124.46 curveto 99.9067 125.73 101.6 127.847 106.68 129.54 curveto eofill grestore % arrow 0 setgray gsave newpath 106.68 129.54 m 103.251 129.357 l 104.047 127.337 l closepath eofill grestore gsave newpath 55.88 121.92 m 67.7333 122.767 82.9733 123.19 91.44 124.46 curveto 98.0034 125.445 100.496 126.938 103.652 128.348 curveto stroke grestore showpage grestore %%Trailer end draw_initial_state restore restore