DIRECTORY Convert, Core, CoreOps, EU2, FS, IO, Ports, Rope, RosemaryUser; EU2Test: CEDAR PROGRAM IMPORTS Convert, CoreOps, EU2, FS, IO, Ports, Rope, RosemaryUser = BEGIN OPEN EU2; CARD: TYPE = LONG CARDINAL; ROPE: TYPE = Rope.ROPE; FileIndexToPortIndex: TYPE = REF FileIndexToPortIndexRec; FileIndexToPortIndexRec: TYPE = RECORD [x: SEQUENCE size: NAT OF INT]; ct: Core.CellType _ EU2.CreateEU2[]; VecFileName: ROPE; Init: PROC = { [] _ Ports.InitTesterDrive[ct.public[Vdd], force]; [] _ Ports.InitTesterDrive[ct.public[Gnd], force]; [] _ Ports.InitTesterDrive[ct.public[PadVdd], force]; [] _ Ports.InitTesterDrive[ct.public[PadGnd], force]; [] _ Ports.InitTesterDrive[ct.public[PhA], force]; [] _ Ports.InitTesterDrive[ct.public[PhB], force]; [] _ Ports.InitTesterDrive[ct.public[DPData], none]; [] _ Ports.InitTesterDrive[ct.public[DPRejectB], force]; [] _ Ports.InitTesterDrive[ct.public[KBus], none]; [] _ Ports.InitTesterDrive[ct.public[EURes3BisPBus3AB], force]; [] _ Ports.InitTesterDrive[ct.public[EUWriteToPBus3AB], force]; [] _ Ports.InitTesterDrive[ct.public[EUAluOp2AB], force]; [] _ Ports.InitTesterDrive[ct.public[EUCondSel2AB], force]; [] _ Ports.InitTesterDrive[ct.public[EUCondition2B], expect]; [] _ Ports.InitTesterDrive[ct.public[DShiftAB], force]; [] _ Ports.InitTesterDrive[ct.public[DExecuteAB], force]; [] _ Ports.InitTesterDrive[ct.public[DNSelectAB], force]; [] _ Ports.InitTesterDrive[ct.public[DHoldAB], force]; [] _ Ports.InitTesterDrive[ct.public[DDataInAB], force]; [] _ Ports.InitTesterDrive[ct.public[DDataOutAB], force]; [] _ RosemaryUser.MakeStandardViewer[name: "EU2 Tester", cellType: ct, testButtons: LIST[["TestEU2", TestEU2]], displayWires: RosemaryUser.DisplayPortLeafWires[wire: ct.public]]; }; TestEU2: RosemaryUser.TestProc ~ { Hex: PROC [r: ROPE] RETURNS [CARD] ~ {RETURN [Convert.CardFromRope[r, 16]]}; GetHex: PROC RETURNS [CARD] ~ {RETURN [Hex[IO.GetTokenRope[from].token]]}; from: IO.STREAM _ FS.StreamOpen[VecFileName]; nbPorts: INT _ IO.GetCard[from]; -- number of ports in the header perm: FileIndexToPortIndex _ NEW[FileIndexToPortIndexRec[nbPorts]]; FOR i: INT IN [0..nbPorts) DO perm[i] _ CoreOps.GetWireIndex[ct.public, IO.GetRopeLiteral[from]]; -- -1 if not found [] _ IO.GetCard[from]; -- ignore the number of bits ENDLOOP; DO FOR fileIndex: INT IN [0..nbPorts) DO i: INT _ perm[fileIndex]; r: ROPE; val: CARD; r _ IO.GetTokenRope[from].token; IF Rope.Equal[r, "."] THEN LOOP; -- same as previously IF i=-1 THEN {[] _ IO.GetTokenRope[from]; LOOP;}; -- ignore this port p[i].d _ SELECT Hex[r]/16 FROM -- "b" field 0 => none, 1 => expect, 2 => drive, ENDCASE => ERROR; val _ GetHex[]; -- the value of the port SELECT p[i].type FROM b => p[i].b _ (val=1); c => p[i].c _ val; lc => p[i].lc _ val; ENDCASE => ERROR; ENDLOOP; Eval[]; ENDLOOP; }; Init[]; END. EU2Test.mesa Louis Monier March 7, 1986 10:06:41 am PST McCreight, March 27, 1986 3:11:14 pm PST -- Read header -- find a public wire with this name, and put its index in the permutation -- an entry is either "." or "bs val" with b IN [0..3], s IN [0..F], and val is a cardinal. ΚJ˜codešœ ™ K™*K™(—K˜KšΟk œœ˜IK˜šΟnœœ˜Kšœœ˜BKšœœ˜—K˜Kšœœœœ˜Kšœœœ˜Kšœœœ˜9Kš œœœœœœœ˜FKšœ$˜$Kšœ œ˜K˜šžœœ˜Kšœ3˜3Kšœ2˜2Kšœ6˜6Kšœ5˜5Kšœ3˜3Kšœ2˜2K˜Kšœ4˜4Kšœ8˜8K˜Kšœ2˜2Kšœ?˜?Kšœ?˜?Kšœ9˜9Kšœ;˜;Kšœ=˜=K˜Kšœ9˜9Kšœ9˜9Kšœ:˜:Kšœ6˜6Kšœ9˜9Kšœ9˜9K˜KšœTœZ˜²K˜K˜—K˜šžœ˜"Kš žœœœœœœ ˜LKš žœœœœœœ˜JKšœœœœ˜-Kšœ œœΟc ˜BKšœœ#˜CK™šœœœ˜K™JKšœ*œŸ˜WKšœœŸ˜3Kšœ˜—š˜K™[šœ œœ˜%Kšœœ˜Kšœœ˜Kšœœ˜ Kšœœ˜ KšœœœŸ˜6Kš œœœœŸ˜Ešœ œ Ÿ ˜+K˜ K˜ K˜ Kšœœ˜—KšœŸ˜(šœ ˜Kšœ˜Kšœ˜Kšœ˜Kšœœ˜—Kšœ˜—K˜Kšœ˜K˜Kšœ˜—K˜—K˜˜K˜—Kšœ˜—…— |