DIRECTORY CoreFlat, IO, Ports, REFBit, Rope, Rosemary, RoseTV, SafeStorage, TerminalIO; RoseTVImpl: CEDAR PROGRAM IMPORTS CoreFlat, IO, REFBit, Rope, Rosemary, SafeStorage, TerminalIO EXPORTS RoseTV = BEGIN ROPE: TYPE = Rosemary.ROPE; RTVal: TYPE = RoseTV.RTVal; RTValRec: TYPE = RoseTV.RTValRec; FldBitNmProc: TYPE = RoseTV.FldBitNmProc; New: PUBLIC PROC [path, field: ROPE, ref: REF, struc: BOOL _ TRUE, fldBitNm: FldBitNmProc _ SimpleDotIndexing] RETURNS[tv: RTVal] = { sz: NAT _ REFBit.Size[ref]; tv _ NEW[RTValRec [(IF struc THEN 1 ELSE sz)]]; tv.buf _ NEW[Ports.LevelSequenceRec [(IF struc THEN sz ELSE 1)]]; tv.path _ path; tv.field _ field; tv.ref _ ref; tv.fldBitNm _ fldBitNm; }; XFerList: PUBLIC PROC[sim: Rosemary.Simulation, rtvs: LIST OF RTVal] = { FOR rtvs _ rtvs, rtvs.rest WHILE rtvs#NIL DO []_XFer[sim, rtvs.first]; ENDLOOP}; XFer: PUBLIC PROC[sim: Rosemary.Simulation, rtv: RTVal] RETURNS[ref: REF] = { IF rtv[0].wire=NIL THEN FOR index: NAT IN [0..rtv.wwrSize) DO signalPath: ROPE _ Rope.Cat[rtv.path, ".", rtv.fldBitNm[rtv, index] ]; rtv[index].wire _ NEW[CoreFlat.FlatWireRec]; rtv[index].wire^ _ CoreFlat.ParseWirePath[sim.cellType, signalPath ! SafeStorage.NarrowRefFault, CoreFlat.PathError => {TerminalIO.PutF["Bad Path: %g\n", IO.rope[signalPath]]; LOOP}]; ENDLOOP; rtv.bad _ FALSE; FOR index: NAT IN [0..rtv.wwrSize) DO IF rtv[index].wire.wire=NIL THEN RETURN[rtv.ref]; -- bad path rtv.buf _ Rosemary.WireValue[sim, rtv[index].wire]; FOR levelBit: NAT IN [0..rtv.buf.size) DO SELECT rtv.buf[levelBit] FROM L, H => { sense: BOOL _ (rtv.buf[levelBit]=H)#(rtv[index].inverted); REFBit.Set[rtv.ref, AdjustLongNumIndex[rtv.ref, index+levelBit], sense]}; ENDCASE => { IF NOT rtv.bad THEN TerminalIO.PutF["Bad Value for: %g ", IO.rope[rtv.field]]; TerminalIO.PutF["%g ", IO.int[index+levelBit]]; rtv.bad _ TRUE}; ENDLOOP ENDLOOP; IF rtv.bad THEN TerminalIO.PutF["\n"]; RETURN[rtv.ref]}; AdjustLongNumIndex: PROC[ref: REF, index: INT] RETURNS[INT] = { WITH ref SELECT FROM real: REF RoseTV.Real => RETURN[(index+16) MOD 32]; -- swap words int: REF RoseTV.Int => RETURN[(index+16) MOD 32]; -- swap words lc: REF RoseTV.LongCard => RETURN[(index+16) MOD 32]; -- swap words ENDCASE => RETURN[index]}; SimpleDotIndexing: PUBLIC FldBitNmProc = { RETURN[IF rtv.wwrSize=1 THEN "" ELSE IO.PutFR["%g.%g", IO.rope[rtv.field], IO.int[index]] ]}; END. βRoseTVImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Curry, October 16, 1986 5:45:45 pm PDT Don Curry October 24, 1986 5:45:03 pm PDT Last Edited by: Louis Monier February 10, 1987 5:33:53 pm PST Κž˜™Jšœ Οmœ1™