DIRECTORY TamarinBlocks, TamarinOps USING [FourBitIndex, FiveBitIndex, Word], TamarinOpsUtils; HandTest: CEDAR PROGRAM IMPORTS TamarinBlocks, TamarinOpsUtils = BEGIN OPEN TamarinOps, TamarinOpsUtils; Shifter: PROC [w0, w1: INT, dist: FiveBitIndex] RETURNS [result: INT] ~ { wordResult: TamarinOps.Word; bot: TamarinOps.Word _ IntToWord[w0]; top: TamarinOps.Word _ IntToWord[w1]; wordResult _ TamarinBlocks.Shifter[top, bot, dist]; RETURN [WordToInt[wordResult]]; }; Adder: PROC [euOp: NAT, w0, w1: INT] RETURNS [result: INT, overFlow, carry, gt: BOOL] ~{ wordResult: TamarinOps.Word; d1: TamarinOps.Word _ IntToWord[w0]; d2: TamarinOps.Word _ IntToWord[w1]; [wordResult, overFlow, carry, gt] _ TamarinBlocks.Adder[euOp, d1, d2]; RETURN [WordToInt[wordResult], overFlow, carry, gt]; }; Priority: PROC [w0: CARD] RETURNS [priority: CARD] ~ { inword: TamarinOps.Word _ CardToWord[w0]; priority _ WordToCard[TamarinBlocks.PriorityEncoder[inword]]; RETURN [priority]; }; LogicalUnit: PROC [euOp: FourBitIndex, w0, w1: CARD] RETURNS [result: INT] ~ { wd0: TamarinOps.Word _ CardToWord[w0]; wd1: TamarinOps.Word _ CardToWord[w1]; wordResult: TamarinOps.Word; wordResult _ TamarinBlocks.LogicalUnit[euOp, wd0, wd1]; RETURN [WordToInt[wordResult]]; }; Multiplier: PROC [w0, w1: CARD, sgnd: BOOL _ TRUE] RETURNS [resultH, resultL: CARD] ~ { wd0: TamarinOps.Word _ CardToWord[w0]; wd1: TamarinOps.Word _ CardToWord[w1]; resL, resH: TamarinOps.Word; [resH, resL] _ TamarinBlocks.Multiplier[wd0, wd1, sgnd]; RETURN [WordToCard[resH], WordToCard[resL]]; }; CycleStatRec: TYPE = RECORD [ min: NAT, max: NAT, avg: REAL]; BadNumRec: TYPE = RECORD [ d1: INT, d2: INT]; END. 0HandTest.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. February 11, 1987 7:51:13 am PST by Mark Ross Last Edited by: Ross April 6, 1987 12:29:38 pm PDT Random USING [ChooseInt, Create, RandomStream], IMPORTS Random, TamarinBlocks, TamarinOpsUtils = BEGIN OPEN TamarinOps, TamarinOpsUtils; RandomMult: PROC [numTests, range0, range1: CARD] RETURNS [stats: CycleStatRec] ~ { wd0: TamarinOps.Word; wd1: TamarinOps.Word; wordResult: TamarinOps.Word; overFlow: BOOL; numCycles: NAT _ 0; int0, int1: INT; randStream: Random.RandomStream; stats.min _ 16; stats.max _ 0; stats.avg _ 0; randStream _ Random.Create[]; FOR i: CARD IN [1..numTests] DO int0 _ Random.ChooseInt[randStream, 0, range0]; int1 _ Random.ChooseInt[randStream, 0, range1]; wd0 _ IntToWord[int0]; wd1 _ IntToWord[int1]; [wordResult, overFlow, numCycles] _ TamarinBlocks.Multiplier[wd0, wd1]; IF numCycles > stats.max THEN stats.max _ numCycles; IF numCycles < stats.min THEN stats.min _ numCycles; stats.avg _ stats.avg + (numCycles - stats.avg)/i; ENDLOOP; RETURN [stats]; }; Κ˜™ Icode™