SimMOSby Martin NewellVersion of December 5, 1980 12:27 PM[Ivy]SimMOS>SimMOS.bravo,.pressPREFACESimMOS is a mixed mode switch level and functional simulator for n-channel MOS circuits.No timing information is represented in the simulator, although sequential circuits, and evensome asynchronous circuits, can be simulated. Parts of a circuit can be replaced with user-written procedures that model the behaviour of those parts. This permits the simulation ofcritically timing dependent subcircuits, enhances efficiency, and permits top down developmentof circuits by starting with only their functional simulation, and substituting implementations ofparts of the circuit as they are developed.XEROXPALO ALTO RESEARCH CENTER3333 Coyote Hill RoadPalo Alto California 94304 Sp Pqr Ks% G>t# 7r24tB23@X21Q 206[2.A2-, T2++)Wu)`rX)`)` rs ;t 8 5r 2F / + 'rs #t   k rs rsrs R9ZsSimMOS31. INTRODUCTIONSimMOS is a mixed mode switch level and functional simulator for n-channel MOS circuits.No timing information is represented in the simulator, although sequential circuits, and evensome asynchronous circuits, can be simulated. Parts of a circuit can be replaced with user-written procedures that model the behaviour of those parts. This permits the simulation ofcritically timing dependent subcircuits, enhances efficiency, and permits top down developmentof circuits by starting with only their functional simulation, and substituting implementations ofparts of the circuit as they are developed. However, use of this technique is not yetdocumented.1.1 BackgroundSimMOS is based on the switch level simulator MOSSIM from MIT. MOSSIM was originallywritten by Randy Bryant to support the VLSI course given at MIT by Lynn Conway in the Fallof 1978. Since then it has been further developed by Randy Bryant and has been adapted byseveral people into various versions in several languages. A version by Chris Terman, written inLisp, was used to diagnose the design of the Scheme79 microprocessor. It is this version thatformed the basis for the Mesa implementation, SimMOS.1.2 AcknowledgementsTo Randy Bryant and Chris Terman at MIT, and to Alan Bell, for several long discussions andhelp in sorting out the basic algorithms. Voluminous feedback from the first heavy user, JimCherry, was instrumental in getting SimMOS into a usable state.2. OPERATIONSimMOS is implemented as a set of programs in Mesa. Several versions are available forrunning on different configurations of machines, ranging from a single bank Alto version,through an XM Alto version using high memory for data storage, to D0 and Dorado versionsthat make efficient use of high memory. The D version on the Dorado is about 60 times fasterthan the XM Alto version. Only the XM Alto and D machine versions are distributed.While the basic SimMOS functions are implemented in Mesa, the user interface is provided byrunning SimMOS under the interactive programming system JaM [JaM]. JaM provides asimple interpreter that supports the JaM programming language, and from which Mesaprograms can be called. This programmibility of the user interface proves to be invaluable fordeveloping test procedures for circuits being simulated. (It also provides the basic mechanismby which functional simulation can be implemented along with the switch level simulation).For the purposes of this document the term SimMOS will be used to cover the combination ofthe basic implementation and the JaM user interface.2.1 Input FormatsCircuits can be specified to SimMOS in one of two formats: the .sim format or as a JaMprogram, or as a combination of both. The .sim format is provided to allow input from ClarkBaker's circuit extractor, developed at MIT. This is a simple keyword format in which everynode and every transistor is explicitly listed. Apart from that the format is fairly compact. It isunlikely that anyone will want to create a specification of a circuit in .sim format, except fromthe circuit extractor.The other format, a JaM program, is typically used for making incremental changes to a circuitthat has been read in from .sim format. Since JaM programs can be executed from files, thisformat also provides a way of storing such changes, or even whole circuits. An advantage ofusing the JaM format is that procedural descriptions are available, so that repeated ftG brs 2^tB2]mX2[Q 2Zc[2XA2WY T2U92TO Q# 2MC2LrN 2J:2Ih S2G@2F^5 C22@K2>M2<? 8)rs24t4#23xY21F20n'62.#02+0+2*8 D2(22'.0/2%U 2$$7#2"6$2!4 2J 2=6&2V23D!2U 2)2V2x(42 H2 n2 3G 'Alto>SimMOS>SimMOS.cm[Ivy]DStar>SimMOS>SimMOS.cmfor the XM Alto and D machine versions respectively. Also on that directory is a file: ftG2b8 ^2[9"2ZA-*2XK2W7W 2U:$2T-"52R*82Q#_2ON 2NS2L.2IhZ2G T2F^C2D&vt 2CTK2A:2@JD2>*62=@F2;b2:6W27 9!25Q24@22{++20:2/q9&2-!;2,g222*+v t2)]H2'D2&S`2$)2!`2 !@2[26$2 b26M 2 YB, SimMOS>cleanupSimMOS.cmthat will delete most of the files created during a run. This is useful for cleaning up after usinga Dorado.3. COMMANDSThe available commands are from three sources - commands directed to JaM, primitiveSimMOS commands, and JaM procedures. While users need not be concerned with thesedistinctions, it may be helpful to note that online documentation of most commands that areimplemented as JaM procedures can be obtained using the JaM utility command "?", e.g.(arraysim)?. Moreover, these commands can be used as a starting point for new commandstailored to a particular need.The commands are presented here in six categories: Initialization, Circuit Definition, Settingand Reading Values, Running a Simulation, Saving and Restoring State, and Other.3.1 InitializationFirst get and initialize SimMOS as described under 2.3 "Where to find SimMOS". From hereon the operating procedures for both Alto and D machine versions are the same. SimMOS isnormally started by typing:jam simmosWhen loaded SimMOS should prompt with the message:SiMMOS>>at which time it is ready for commands. The initial getting and initializing if SimMOS willleave SimMOS in this same state.Note that commands in JaM are executed when a carriage return is typed. Several commandscan be put on one line.simresetUsage: simresetInitialize the stored circuit to null. The circuit is automatically initialized on start-up, sosimreset need be called only to clean out an existing circuit. e.g.simresetFine point: while simreset is implemented in all versions, it doesn't currently release the space used in allversions, so its use for large circuits is to be discouraged - get out of SimMOS and start again.3.2 Circuit DefinitionsimreadUsage: simreadRead the definition of a circuit in .sim format from the indicated file. e.g.(mycircuit.sim)simread.runUsage: .run ftGb2^*:2]m Xrs2Unt/$2SL2RdG2P82OZ2%2M2J?2I$P E2B,-2AGO 2?w421tT202,P2+W2(+r&tr%!t+5#D( pwgq\*': "t2rqtrtN(w2 r trl ;l]BSimMOS6Run the indicated file as a JaM program. This JaM primitive is included here since it isused for creating a circuit specified as a JaM program. e.g.(mycircuit.jam).runsimnodeUsage: simnodeCreate a node having the given name. If a node of the given name already exists this doesnothing. Note that the nodes (VDD) and (GND) are always defined in SimMOS, and havethe expected values. Node names are stored as originally specified, but their recognition iscase shift independent. For example (vdd), (Vdd), and (VDD) are all equivalent. e.g.(newnode)simnodewould create a node having the name "newnode".etransUsage: etransCreate an enhancement mode transistor connecting the nodes having the specified names.Any node that doesn't already exist is created. e.g.(input)(GND)(pulldown)etransdtransUsage: dtransCreate a depletion mode transistor connecting the nodes having the specified names. Anynode that doesn't already exist is created. e.g. to create a pullup for node bus0:(bus0)(bus0)(VDD)dtranslistetransUsage: listetransList all enhancement mode transistors having the specified gate, and source and drain beingterm1 and term2 in either order. Output is in the form of a list of etrans commands. Anull string for a node name acts as a wild card, e.g. to list all enhancement modetransistors (not to be used indiscriminately):()()()listetransor to list all enhancement mode transistors with gates connected to the node PHI1:(PHI1)()()listetranslistdtransUsage: listdtransSame as listetrans except that only depletion mode transistors matching the given names arelisted.Note that depletion mode pullups are not represented explicitly in the SimMOS datastructure. Consequently super buffer pullups will be reported as regular depletion modepullups. Other types of depletion mode transistors, such as in function blocks, are correctlyreported.listtransUsage: listtransA combination of listetrans and listdtrans. ftGbM `=(]mw2ZArXtrW7tIUOT-9$R>(O|wLPt.2I$rGtrFtOD4(Aiw2>=r redefinetransRedefine the transistor specified by the first three parameters to be connected as given bythe last three parameters. The first three parameters are used as in listtrans, using wildcards etc. If the first three parameters do not define a unique transistor then no action istaken. e.g. to reconnect the drain of a given transistor from node (n1) to (n2):(g0)(n0)(n1) (g0)(n0)(n2) redefinetranslogchangesUsage: logchangesArrange to log on all JaM commands that modify the circuit, for later replaying ofsuch modifications. The stream must be set up using the JaM command .bytestream, e.g.(changesstream)(changes.log) 4 .bytestream .defchangesstream logchangesThis opens the file changes.log and sets it up for logging changes. The parameter, 4, to.bytestream creates the stream for appending. This is useful for adding to an existing log ofchanges. Use of 6 instead would rewrite or create the file afresh.unlogchangesUsage: unlogchangesSwitch off logging of changes.3.3 Setting and Reading ValuescircuitresetUsage: circuitresetCharge every node that is connected to at least one gate to , for = (0) | (1)| (X). (X) indicates "undefined". e.g.(0)circuitresetwould charge all gate nodes to low.hiUsage: hiTie the indicated node to VDD. e.g.(input1)hiloUsage: loTie the indicated node to GND. e.g.(input1)loxUsage: xRemove VDD or GND from the indicated node. The value of the node will not changeeven if it is not a storage node. This is useful for initialization. e.g.(trinode)hi (trinode)x ftG2br `t2r _tR]<\ EZQ(WYw'2T-r Rtr Q#tJO>(Lrw/(JGtv t:F<=!DC2Ar @tr >t ;U28)r 6tr 5tD3((0nw-Bt#2*r(tr' t$(#w 2 r/trt$(~w 2RrtrHt DK(wz P8XSimMOS8chhiUsage: chhiCharge the indicated node to high. The node must be connected to the gate of at least onetransistor for this to have any effect. e.g.(bit5)chhichloUsage: chloCharge the indicated node to low. The node must be connected to the gate of at least onetransistor for this to have any effect. e.g.(bit5)chlogatestorageUsage: gatestorageSet mode for charge storage. If switch=.true then charge can be stored only on the gatesof transistors. If switch=.false then charge can be stored on any node. In either case,charge cannot be stored on a node that is either an input or is pulled up.getnodevalueUsage: getnodevalue => Get the current value of the indicated node as a string. The is left on the JaMstack as a string = (1) | (0) | (X) . e.g. (input1)getnodevalue might leave the string (1) onthe stack. This string could be printed with the JaM command "=", e.g.(input1)getnodevalue =might print0getbitUsage: getbit => Get the current value of the indicated node as an integer. The is left on theJaM stack as an integer = (-1 | 0 | 0) for (hi | lo | x), respectively (notice that x results in0). e.g. (input1)getbit might leave the integer -1 on the stack. This integer could beprinted with the JaM command "=", i.e.(input1)getbit =would print-1This value is useful for subsequent JaM logical operations, such as .bitand, .bitor, .bitnot,.bitxor, for functional simulation.putbitUsage: putbitSet the indicated node to the indicated value. The node is set to lo | hi for = zero| non-zero, respectively. e.g.(input1) 1 putbit ftG2br`tr_tF]-(Zcw 2W7rUtrT-tIR-(O|w 2LPr Jtr IFt=G;F<J2Cr Atr t@+1>,vtvt<G(9w6t (3xw20Lr.trt-BB+`*8 v tvt(&(%w"[t (/wtI~#2RrtrHtN(w P8XSimMOS9would set input1 to hi.getwordUsage: getword => Construct a word from the current values of the nodes defined by , andleave that word on the JaM stack. The is a JaM array of node names,typically set up using the JaM utilities "[", "]", and ".def", e.g.(aluoutput) [ (out4)(out3)(out2)(out1)(out0) ] .defSpaces around the "[" and "]" are necessary. Thenaluoutput getwordwill leave an integer on the JaM stack made up of the values of the indicated nodes, rightjustified in the word, i.e. in the above example, out0 will be represented as the lsb of theresult.putwordUsage: putwordSet the nodes defined in to the corresponding bits in the integer .The is as defined in getword. e.g.(bus) [ (in2)(in1)(in0) ] .defthenbus 6 putwordwould set: in2 to hi, in1 to hi, in0 to lo.arraynamesUsage: arraynamesList the names of the nodes given in . This command is for use witharraysim and for looking at wordspecifiers (see getword, putword). e.g.outarray arraynamesmight generate(out1)(out2)arraystringsUsage: arraystringsList the current values of all the node strings in . This command is foruse with the command arraysim. More than one array can be listed by giving twocommands consecutively, e.g.inarray arraystrings outarray arraystringsmight generate01010101 = in000110011 = in100001111 = in201101001 = out1 ftGb2^r]mtrt [(-Zc!3XC(Uw3Rt2(OZwL.t.,J":I$2ErDstrBt(1Ai3(>=w;t(7w 4t+21r 0tr .tT,vtv tvtvt()w&t (#zw 2 Nr tr Dt?vt0:(w+t (w (1 ( (  [9]SimMOS1010110101 = out2If each string will not fit on one line then the whole set is continued below. This is tomake it easier to establish correspondence between values.arrayvaluesUsage: arrayvaluesList the current values of the nodes given in . This command is for usewith arraysim and for looking at wordspecifiers (see getword, putword). e.g.outarray arrayvaluesmight generateout1 = 1out2 = 03.4 Running a SimulationsimstepUsage: simstepRun the simulator to solve the circuit for the current set of input values. See alsomaxmicrosteps. In case of long or unterminating computations, simstep can be interruptedusing the JaM break key (rightshift-swat). Fine point: currently it is inadvisable to hold the break keydown for an extended period, or you will get a stack overflow. Better to strike the key firmly, then havepatience, since the break will not actually happen until the next microstep has completed.simsolveUsage: simsolve => Same as simstep except that the number of iterations needed to achieve convergence is lefton the JaM stack. Zero iterations means that the state of the circuit did not change. Thisis useful for including functional simulation. See also maxmicrosteps.maxmicrostepsUsage: maxmicrostepsSet maximum number of iterations that will be attempted in simstep and simsolve. Thedefault is 100.microstepUsage: microstep => <#changes>Run one iteration of the simulator, and leave the number of nodes that changed on thestack.reportshortsUsage: reportshortsControl reporting of shorts in microstep. Default is .true.reportchangesUsage: reportchangesControl reporting of changes in microstep. Default is .false. If .true then nodes thatchange during a microstep are listed. This is useful for diagnosing circuits that do notstabilize.arraysimUsage: arraysimFor each set of values in the input vector, set up the inputs, solve the circuit, and collectthe outputs named in the output vector. The input and output arrays are JaM arrays of ftG?(bw^t?]m:2ZAr Xtr W7t*.Uvtv tvtvt(RwOZt (L.w(J G}t2DQrBtrAGt&/?v t B>=,q 2<?+;{Z28Or6trt5ER3J2;9v t2/r -tr ,tB*2'Tr%trt $JN"2r tr t<2cr tr YtB<O 2#rt!r t2+ E& M8\SimMOS11node names, typically set up using the JaM utilities "[", "]", and ".def", e.g.(inarray) [ (in0)(in1)(in2) ] .def(outarray) [ (out1)(out2) ] .defEach of the names specified in the input array must be defined as JaM strings representingthe sequence of values required for each input node, e.g.(in0)(01010101).def(in1)(00110011).def(in2)(00001111).defThe node names specified in the output array will be associated with the collected outputstrings and need not be initialized. Given the above definitions, the command:inarray outarray arraysimwill solve the circuit 8 times, having set up the inputs in2, in1, in0 to 000, 001, 010, 011,100, 101, 110, 111, and will collect the outputs at each step as strings in the JaM variablesout1 and out2. These strings can be examined using the JaM command =, e.g.out1 =might generate01101001It is often convenient to have all the inputs and outputs listed together. See the commandsarraystrings, arrayvalues, and arraynames under 3.3.While various clocking schemes etc. can be implemented using arraysim as described, it issometimes more convenient to be able to do several things between setting up each set ofinputs and collecting the corresponding outputs. For this reason, arraysim actually works asfollows. For each set of values in the inputarray arraysim does the following 4 steps:1) set up the input values,2) invoke the JaM procedure clock1,3) collect the outputs, and,4) invoke the JaM procedure clock2.At initialization the procedure clock1 is set up to simply call simstep, and the procedureclock2 is a nop. These procedures can be redefined to implement more elaborate schemes.For example, to implement a 2 phase, non-overlapping clock, PHI1 and PHI2, to be cycledafter each input is set up, clock1 could be redefined as follows:(clock1)((PHI1)hi simstep (PHI1)lo simstep (PHI2)hi simstep (PHI2)lo simstep).cvx .defIncidentally, for this example it is normally adequate, and more efficient, to define clock1 tobe: ftG?bO(^w"(]mZAtIX9(Uw(T (ROZt KMO(JwG}tEE8%DsK(AGw>t (:w7t Q6>v tv tv t 3S1 J0 S.A+W)vt(M&vt#;"E D A(w(\((R((H t\ P9XSimMOS12(clock1)((PHI1)hi (PHI2)lo simstep (PHI1)lo (PHI2)hi simstep).cvx .defarraysim can be interrupted during operation by pressing the JaM break key (rightshift-swat). Fine point: currently it is inadvisable to hold the break key down for an extended period, or you willget a stack overflow. Better to strike the key firmly, then have patience, since the break will not actuallyhappen until the next simulation cycle has completed. Having interrupted arraysim, almost all of thecommands can be safely used for e.g. examining node values, setting node values,modifying the circuit, changing the input array strings (but not the list of names in theinput and output arrays), and even for leaving SimMOS completely. The simulation can berestarted using resumearraysim (see below).resumearraysimUsage: resumearraysimResume the running of an arraysim after it has been interrupted.3.5 Saving and Restoring StatesimwriteUsage: simwriteWrite a .sim file describing the circuit currently stored in the SimMOS data structure. e.g.(newcircuit.sim)simwriteA circuit thus saved can be restored later using simread.writestateUsage: writestateWrite a JaM file describing the current state of the circuit stored in the SimMOS datastructure. This file takes the form of a list of invocations of hi,lo,x,chhi,chlo. e.g.(circuitstate.jam)writestateSubsequent use of the .run command on this file will cause the state of all the nodes to berestored. After such a restoration, one call to simstep should be made, to drive non-storagenodes to their correct values.3.6 OtherThis section contains miscellaneous commands from JaM and SimMOS that might be founduseful.inverterUsage: inverterCreate a pair of transistors implementing an inverter for the given pair of nodes.nandUsage: nandCreate 3 transistors to implement a nand circuit.norUsage: norCreate 3 transistors to implement a nor circuit. ftG?(bw(`(_(] ZctHXq=)W}'FV5t0T  DSYQHPv t 2Lr KWtr It@ F2CzrAtr@ptL(=Dw:t1vt26r 5gtr 3t K2]S(/1w,t:!*0-( %2"N2!2rmtrtR2r7trt12rtr|t0 5;lYSimMOS13pullupUsage: pullupCreate a depletion mode pullup transistor to pull up the indicated node. e.g.(bus0) pullupgensymUsage: gensym => Leaves a unique node name as a string on the JaM stack. This is useful for generatingnames of interior nodes in procedurally defined circuits.gennamesUsage: gennamesDeclares JaM variables having the given names, and assigns to them their own namesconcatenated with the result of a single common call to gensym. This command is useful inprocedural definitions of circuits in which local names that can later be identified areneeded. e.g.(in out int)gennamesgenerates the 3 JaM variables, in, out, and int, with the string values (in#), (out#), and(int#), respectively, where # is the result of a single call to gensym./getargsUsage: ...( ...) /getargsThis JaM command expects a string of names separated by spaces. It creates JaMvariables having the given names, and assigns to them the values preceding the string onthe stack in a one to one correspondence. e.g.3 1.5 (hello) (i r s) /getargswould create the JaM variables i,r, and s, and assign to them the values 3, 1.5, and thestring hello, respectively. This command is useful as the first command in a JaMprocedure, to get the arguments from the stack..printUsage: .printThis JaM command prints the given . e.g.(hello).print/printUsage: /printThis JaM command prints the given followed by a carriage return..defUsage: .defThis is the JaM assignment command, and assigns to . .def is used to setup both ordinary variables and procedures. e.g.(numbervariablename) 23 .def(stringvariablename)(this is a string, not a procedure) .def(procedurename)((hello).print).cvx .def.cvxUsage: .cvxThis JaM command changes the execution interpretation of the given . When ftG?2br`tr_tN([w 2XrW7trtU:T-92QrO|trMt5LrZJBIh (F_r .reptThis is the JaM iteration command, and will execute the given times.e.g.5 (procedurename (!).print).cvx .reptwould print, (given the definition of procedurename given under the description of .def):hello!hello!hello!hello!hello!.quitUsage: .quitThis is the JaM termination command, and must be used for leaving JaM in a controlledway with virtual memory saved.4.0 EXAMPLESFirst get and initialize SimMOS as described under section 3.1 Initialization.4.1 Nor GateSimulation of this simple circuit will be covered in some detail to show the various possibilities.The circuit is a simple 2 input nor gate. The inputs will be nodes in1 and in2 and the outputwill be node out. First of all it is necessary to define the circuit. In .sim format this might berepresented on the file norcircuit.sim by:e in1 gnd oute in2 gnd outd out out vddand in JaM:(in1)(GND)(out)etrans(in2)(GND)(out)etrans(out)(out)(VDD)dtransThis latter definition could be typed directly to SimMOS or could be put on a file, saynorcircuit.jam.We now start SimMOS. This is done by typingjam simmosto the Alto executive, and waiting for the prompt ">". If we wish to read the circuit definitionfrom the .sim file, type:(norcircuit.sim)simreador to read it from the JaM file:(norcircuit.jam).run ftG?bL 2^r]mtr[tVZc(W7w%T t&v t (Pw2MrL.trJtJ I$ DQrs2A%tN = 2:c29HDvtvt27 vt-'26>v t3w 1 0 2,t )w(+&2#ztK 2!v t2,w 2qtK2w2t hw !< 9 864'3x(1 .-d+*Z2'.tD2%(("}w( $2tv(w2tt6vtvt2G2jvtvt(>w((4(  hvtF2<202;wL29'928m+.26&525c3vt23?22Yvtvt?20v t,*2/O Q ,#2(E2'rN2%_2$h<"2" vt vt2!^ 22M2I2("92S(ww((m(2tvtvt vtvt2 7Jv2 t! vt vt k=%2;t'4vt29(6`w(4(3V(12.t(+yw2(Mt*02&vt1(#w("2tvt22f+vtvtvt2(w(0(#(&(( 2 t 5.0 REFERENCES[JaM] JaM, John Warnock and Martin Newell, [Ivy]JaM.bravo.[Mead and Conway] Introduction to VLSI Systems, Carver Mead and Lynn Conway, AddisonWesley, 1980. ftG?(bw(`(_(](\ (Z(Y(W{(U(Tq2QEtZ2OD2N;M K2G Crs2?t?2<vt 2;3  7;l0JiSimMOS206.0 INDEX OF COMMANDS arraynames3.3 arraysim3.4 arraystrings3.3 arrayvalues3.3 chhi3.3 chlo3.3 circuitreset3.3 .cvx3.6 .def3.6 dtrans3.2 etrans3.2 gatestorage3.3 gennames3.6gensym => 3.6 getbit => 3.3 getnodevalue => 3.3 getword => 3.3 hi3.3 inverter3.6 listetrans3.2 listdtrans3.2 listtrans3.2 lo3.3 logchanges3.2 maxmicrosteps3.4microstep => <#changes>3.4 nor3.6 .print3.6 /print3.6 pullup3.6 putbit3.3 putword3.3.quit3.6 redefinetrans3.2 reportchanges3.4 reportshorts3.4 .rept3.6resumearraysim3.4 .run3.2 simnode3.2 simread3.2simreset3.1simsolve => 3.4simstep3.4 simwrite3.5unlogchanges3.2 writestate3.5 x3.3 ftG? brsrs2^tr B@t2]mrB@t2[r B@t2Zcr B@t2X rB@t2WY rB@t2Ur B@t2TOrB@t2R rB@t2QErB@t2OrB@t2N;r B@t2LrB@t2K1rtB@2I rtB@2H' r tB@2Frt B@2E rB@t2CrB@t2Br B@t2@r B@t2? rB@t2= rB@t2;r B@t2:zr B@t28rt B@27prB@t25rB@t24frB@t22 rB@t21\rB@t2/rB@t2.RrB@t2,+r B@t2+H r B@t2) r B@t2(>rB@t2&r B@t2%4 rB@t2# rB@t2"* rB@t2 rB@t2 rtB@2rB@t2 rB@t2r B@t2 r B@t2 rB@t 5ROl HELVETICA TIMESROMAN TIMESROMAN  TIMESROMAN TIMESROMAN LOGO TIMESROMAN GACHA   "',!07<AF.JAN.R [0_bgj/jhW SimMOS.bravoNewellDecember 5, 1980 12:30 PM