<> <> <> <> <> <<>> 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]; <> <> <<>> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <> <<[wordResult, overFlow, numCycles] _ TamarinBlocks.Multiplier[wd0, wd1];>> < stats.max THEN stats.max _ numCycles;>> <> <> <> <<>> <> <<};>> <<>> END. <<>>