Directory Rope, DragOpsCross; Imports EUOps, Dragon, RoseTypes, CacheOps, BitOps, DragOpsCrossUtils; Open EUOps; Cedar ALUOpcode: TYPE = {Add, Sub, Or, And, Xor, PassLeft}; preShiftOpcode: TYPE = {ShNop, Sh1R}; postShiftOpcode: TYPE = {ShNop, Sh2R, Sh1R, Sh1L, PassLeft}; mqOpcode: TYPE = {NoOp, Read, Write, Sh2R, Sh1L}; carrySelChoice: TYPE = {Zero, PrevC, PrevCbar, Update, UpdateBar}; DoubleADD: PROC[al, bl: Dragon.HexWord, carryIn: BOOL] RETURNS [sl: Dragon.HexWord, carryOut: BOOL] = { Xor: PROC[x, y: BOOL] RETURNS [z: BOOL] = {RETURN[(x AND NOT y) OR (y AND NOT x)]}; ai, bi: BOOL; s: BOOL _ FALSE; c: BOOL _ carryIn; sum: BitOps.BitDWord _ [0,0]; FOR i: INTEGER IN [1..32] DO ai _ EBFL[al, 32-i]; bi _ EBFL[bl, 32-i]; s _ Xor[ai, Xor[bi, c]]; c _ Dragon.MoreThanOneOf[ai, bi, c]; -- c _ (ai AND bi) OR (bi AND c) OR (ai AND c); sum _ BitOps.IBID[s, sum, 32, 32-i]; ENDLOOP; RETURN[LFD[sum], c]}; DoubleSUB: PROC[a, b: Dragon.HexWord, carryIn: BOOL] RETURNS [dif: Dragon.HexWord, carryOut: BOOL] ={ [dif, carryOut] _ DoubleADD[a, WordOp[not,b], NOT carryIn]}; Shift1RDtoD: PROC[i0: BOOL, w: Dragon.HexWord] RETURNS [sh: Dragon.HexWord, s31: BOOL] = BEGIN s31 _ BitOps.EBFD[LTD[w], 32, 31]; sh _ LFD[BitOps.MDTD[LTD[w], 32, 0 , 31, LTD[sh], 32, 0, 31]]; sh _ BitOps.IBID[i0, LTD[sh], 32, 0]; END; Shift2RDtoD: PROC[i0, i1: BOOL, w: Dragon.HexWord] RETURNS [sh: Dragon.HexWord, s30, s31: BOOL] = BEGIN sh _ LFD[BitOps.MDTD[LTD[w], 32, 0 , 30, LTD[sh], 32, 0, 30]]; sh _ BitOps.IBID[i0, LTD[sh], 32, 0]; sh _ BitOps.IBID[i1, LTD[sh], 32, 1]; s30 _ BitOps.EBFD[LTD[w], 32, 30]; s31 _ BitOps.EBFD[LTD[w], 32, 31]; END; ; ALUOpcodeCtrl: CELL [ EUAluOpAB< EnumType["Dragon.ALUOps"], -- sent on 2A, used during 2B. Not latched by EU. mqAB30, mqAB31 < BOOL, carryAB < BOOL, LeftOpSign < BOOL, preShiftOp > EnumType["preShiftOpcode"], postShiftOp > EnumType["postShiftOpcode"], ALURealOp > EnumType["ALUOpcode"], mqOp > EnumType["mqOpcode"], CarryIn > BOOL, carryBASelect > EnumType["carrySelChoice"], saveLeftOp > BOOL, rejectBA < BOOL, PhA, PhB { ALURealOp _ Add; CarryIn _ carryAB; carryBASelect _ Zero; }; SSub => { ALURealOp _ Sub; CarryIn _ carryAB; carryBASelect _ Zero; }; UAdd => { ALURealOp _ Add; CarryIn _ carryAB; carryBASelect _ Update; }; USub => { ALURealOp _ Sub; CarryIn _ carryAB; carryBASelect _ UpdateBar; }; VAdd => { ALURealOp _ Add; }; VSub => { ALURealOp _ Sub; }; LAdd => { ALURealOp _ Add; carryBASelect _ Zero; }; LSub => { ALURealOp _ Sub; carryBASelect _ Zero; }; FOP, FOPK => { -- nothing to do, action in the Field Unit }; And => { ALURealOp _ And; }; Or => { ALURealOp _ Or; }; Xor => { ALURealOp _ Xor; }; BndChk => { -- BC _ NOT ( aluLeft IN [0..aluRight) ), AluOut _ aluLeftBus postShiftOp _ PassLeft; ALURealOp _ Sub; -- we throw away the result and pass the left op }; LoadDouble => { postShiftOp _ PassLeft; -- load Result2B with LeftOperand (=0 please) mqOp _ Write; -- load mq with RightOperand }; MulStep => { zero: BOOL _ -- 000 or 111 mqAB30 AND mqAB31 AND prevSubBA OR ~mqAB30 AND ~mqAB31 AND ~prevSubBA; two: BOOL _ -- 011 or 100 mqAB30 AND ~mqAB31 AND ~prevSubBA OR ~mqAB30 AND mqAB31 AND prevSubBA; one: BOOL _ ~zero AND ~two; -- the other cases SELECT TRUE FROM zero => { -- pass left, shift 2R [aluOut, mqAB] with sign extension postShiftOp _ Sh2R; -- with sign extension mqOp _ Sh2R; -- left bits from aluOut }; one => { -- either add or sub, then shift 2R with sign extension carryBASelect _ Update; ALURealOp _ IF mqAB30 THEN Sub ELSE Add; postShiftOp _ Sh2R; -- with sign extension mqOp _ Sh2R; -- left bits from aluOut }; two => { -- shift 1R aluLeft, then add or sub, then shift 1R aluOut preShiftOp _ Sh1R; carryBASelect _ Update; ALURealOp _ IF mqAB30 THEN Sub ELSE Add; postShiftOp _ Sh1R; -- sign extension mqOp _ Sh2R; -- left bit: aluOut31, LeftOp31 ENDCASE => ERROR}; RdMQ => { mqOp _ Read; -- we read mq, i.e. we put its value in Result2B }; DivStep => { postShiftOp _ Sh1L; ALURealOp _ Sub; carryBASelect _ Update; mqOp _ Sh1L; -- left bit from AluOut saveLeftOp _ ; -- depends on N, so see timing }; LastDivStep => { -- same, but shift only mq }; ENDCASE => ERROR Stop["Invalid ALU Operation"]; }; ENDCELL; ALUpreShift: CELL [ LeftOpBus < INT[32], preShiftOp < EnumType["preShiftOpcode"], AluLeftBus > INT[32], LeftOp31 > BOOL, LeftOpSign > BOOL, rejectBA < BOOL, PhA, PhB {AluLeftBus _ LeftOpBus}; -- just pass, for anything but MulStep by 1 or 2 Sh1R => {[AluLeftBus, OpLeft31] _ Shift1RDtoD[FALSE, OpLeftBus]}; -- MulStep by 1 or 2, but probably duplicate the sign bit ENDCASE => ERROR; }; ENDCELL; ALUpostShift: CELL [ AluOut < INT[32], AluLeftBus < INT[32], postShiftOp < EnumType["postShiftOpcode"], sBus > INT[32], ALUOut30, ALUOut31 > BOOL, rejectBA < BOOL, PhA, PhB {sBus _ AluOut}; -- output of the ALU Sh2R => { -- for MulStep by 0 or 1 [sBus, ALUOut30, ALUOut31] _ Shift2RDtoD[CarryOut, CarryOut, AluOut]; -- sign propagation with the carry }; Sh1R => { -- for MulStep by 2 [sBus, ALUOut31] _ Shift1RDtoD[CarryOut, AluOut]; }; Sh1L => { -- for DivStep [] _ Shift1LDtoD[]; }; PassLeft => {sBus _ AluLeftBus}; -- for BndChk and LoadDouble ENDCASE => ERROR; }; ENDCELL; ALUmqStuff: CELL [ RightOpBus < INT[32], ALUOut30, ALUOut31 < BOOL, LeftOp31 < BOOL, mqOp < EnumType["mqOpcode"], sBus > INT[32], mqAB30, mqAB31 > BOOL, rejectBA < BOOL, PhA, PhB {mqBA _ mqAB}; Read => {sBus _ mqBA}; Write => {mqBA _ RightOpBus}; Sh2R => Sh1L => ENDCASE => ERROR; }; ENDCELL; EUJustALU: CELL [ AluLeftBus, RightOpBus < INT[32], CarryIn < BOOL, ALURealOp < EnumType["ALUOpcode"], AluOut > INT[32], CarryOut, Zero, Overflow, AluOut0 > BOOL, -- probably more stuff too rejectBA < BOOL, PhA, PhB { [AluOut, CarryOut] _ DoubleADD[AluLeftBus, OpRightBus, CarryIn];}; Sub => { [AluOut, CarryOut] _ DoubleSUB[AluLeftBus, OpRightBus, CarryIn];}; Or => { AluOut _ WordOp[or, AluLeftBus, OpRightBus];}; And => { AluOut _ WordOp[and, AluLeftBus, OpRightBus];}; Xor => { AluOut _ WordOp[xor, AluLeftBus, OpRightBus];}; PassLeft => { AluOut _ AluLeftBus;}; ENDCASE => ERROR; AluOut0 _ EBFL[AluOut, 0]; Zero _ AluOut=0; Overflow _ ; -- get it from DoubleADD }; ENDCELL; EUCarryCtrl: CELL [ CarryOut < BOOL, carryBASelect < EnumType["carrySelChoice"], EUConditionA < BOOL, carryAB > BOOL, rejectBA < BOOL, PhA, PhB 0, PrevC => carryAB, PrevCbar => NOT carryAB, Update => CarryOut, UpdateBar => NOT CarryOut, ENDCASE => ERROR; prevReject _ rejectBA; -- for the next cycle }; ENDCELL; EUConditionCtrl: CELL [ CarryOut, Zero, Overflow, AluOut0, LeftOpSign < BOOL, EUCondSelAB < EnumType["Dragon.CondSelects"], EUConditionA > BOOL, -- The selected condition sent back to IFU during 3A rejectBA < BOOL, PhA, PhB FALSE, EZ => Zero, -- AluOut=0; (only after a sub!!!) LZ => AluOut0, -- AluOut<0 (high-order bit) LE => Zero OR AluOut0, -- AluOut<=0 True => TRUE, NE => NOT Zero, -- AluOut#0 GE => NOT AluOut0, -- AluOut>=0 GZ => NOT (Zero OR AluOut0), -- AluOut>0 OvFl => overflow, BC => LeftOpSign OR NOT AluOut0, -- LeftOp NOT IN [0..RightOp) IL => , -- wait for Lisp people DivOvFl => , NotOvFl => NOT overflow, NotBC => NOT (LeftOpSign OR NOT AluOut0), NotIL => , ENDCASE => ERROR Stop["Invalid EUConditionBA Code"]; }; ENDCELL; EUAlu: CELL [ LeftOpBus < INT[32], RightOpBus < INT[32], sBus > INT[32], saveLeftOp > BOOL, EUAluOpAB< EnumType["Dragon.ALUOps"], EUCondSelAB< EnumType["Dragon.CondSelects"], EUConditionA> BOOL, PhA, PhBJšœ  œ œ ˜%Jš œ˜—J˜š ฃกœ œ  œ œ  œ˜aJš ˜Jš œ œ œ œ œ˜>Jšœ  œ œ ˜%Jšœ  œ œ ˜%Jšœ  œ œ ˜"Jšœ  œ œ ˜"Jš œ˜——J˜J˜šะbl œ˜™Jšœ&ข1˜WJšœ ˜Jšœ  œ˜Jšœ  ˜Jšœ(˜(Jšœ*˜*Jšœ"˜"Jšœ˜Jšœ  œ˜Jšœ+˜+Jšœ  œ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—šค˜Jšœ  œข.˜@—J˜š ˜ š œ œ œ  œ˜Jšœข˜%J˜—š œ œข#˜1šœ™Jšœ˜Jšœ˜Jšœข-˜FJšœ˜Jšœ œข/˜DJšœข˜(J˜—š œ  ˜šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœ˜—š  œข*˜9Jšœ˜—šœ˜Jšœ˜Jšœ˜—šœ˜Jšœ˜Jšœ˜—šœ˜Jšœ˜Jšœ˜—šœ ข(œขœข ˜IJšœ˜Jšœข0˜CJšœ˜—šœ˜Jšœข-˜GJšœข˜/J˜—šœ ˜ šœ œข ˜Jšœ  œ  œ  ˜'Jšœ œ  œ ˜#—šœ œข ˜Jšœ  œ  œ  ˜&Jšœ œ  œ ˜$—Jšœ œ  œข˜.š œ œ ˜šœ ข9˜CJšœข˜,Jšœข˜)J˜—šœ ข7˜@Jšœ˜Jšœ  œ œ œ˜*Jšœข˜,Jšœข˜)Jšœ˜—šœ ข:˜CJšœ˜Jšœ˜Jšœ œ œ œ˜*Jšœข˜'Jšœข˜0—Jš œ œ˜——šœ ˜ Jšœข0˜AJšœ˜—šœ ˜ Jšœ˜Jšœ˜Jšœข˜Jšœข˜(Jšœข˜/Jšœ˜—šœข˜+Jšœ˜—Jš œ œ˜/—J˜———Jš œ˜J˜šค œ œ˜™ Jšœ  œ˜Jšœ(˜(Jšœ  œ˜Jšœ  œ˜Jšœ  œ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—Jšค˜J˜š ˜ š œ œ œ  œ˜J˜—š œ œข#˜1Jšœ œ˜+Jšœ  œ˜š œ  ˜Jšœ#ข0˜SJšœ. œข9˜{Jš œ œ˜—J˜———Jš œ˜J˜šค  œ˜™ Jšœ  œ˜Jšœ  œ˜Jšœ*˜*Jšœ œ˜Jšœ œ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—Jšค˜J˜š ˜ š œ œ œ  œ˜J˜—š œ œข#˜1š œ  ˜Jšœข˜.šœ ข˜"JšœFข"˜hJšœ˜—šœ ข˜Jšœ1˜1Jšœ˜—šœ ข˜Jšœ˜Jšœ˜—Jšœ!ข˜=Jš œ œ˜—Jšœ,™,J˜———Jš œ˜J˜šค  œ˜™ Jšœ  œ˜Jšœ œ˜Jšœ  œ˜Jšœ˜Jšœ œ˜Jšœ œ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—šค˜Jšœข˜2J˜—š ˜ š œ œ œ  œ˜J˜—š œ œข#˜1š œ ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jš œ œ˜—J˜———Jš œ˜J˜šค  œ˜™ Jšœ œ˜!Jšœ  œ˜Jšœ"˜"Jšœ  œ˜Jšœ$ œข˜D—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—Jšค˜J˜š ˜ š  œ œ œ  œข"˜AJ˜—š œ œข#˜1Jšœ  œข ˜5š œ  ˜šœ˜JšœB˜B—šœ˜JšœB˜B—šœ˜Jšœ.˜.—šœ˜Jšœ/˜/—šœ˜Jšœ/˜/—šœ ˜ Jšœ˜—Jš œ œ˜—Jšœ  œ ˜Jšœ˜Jšœข˜'J˜———Jš œ˜J˜šค  œ˜šœ™Jšœ  œ˜Jšœ+˜+Jšœ œ˜Jšœ  œ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—šค˜Jšœ  œข+˜=Jšœ  œขา˜เ—J˜š ˜ š œ œ œ ข˜6Jš œ œข˜1Jš œ œข˜3Jš œ˜—š œ œข#˜1šœ  œ ˜#Jšœ ˜ Jšœ˜Jšœ  œ ˜Jšœ˜Jšœ  œ ˜Jš œ œ˜—Jšœข˜,J˜———Jš œ˜J˜šค œ˜šœ™Jšœ0 œ˜5Jšœ-˜-Jšœ œข4˜IJ˜—šœ!™!Jšœ  œ˜Jšœ  œ˜Jšœ œ˜ Jšœ ˜J˜J˜—šค˜Jšœ  ˜—J˜š ˜ J˜š œ œ œ  œ˜Jšœ˜J˜—š œ œข#˜1šœ  œ  œข˜9Jšœ  œ˜Jš œ ข*˜7Jš œข˜3Jš œ  œข ˜)Jšœ  œ˜Jš œ œ ข ˜"Jš œ œข ˜%Jš œ œ œ ข ˜,Jšœ˜Jš œ œ œ ข˜@Jš œข˜+Jšœ ˜ Jšœ  œ ˜Jšœ  œ  œ œ ˜*Jšœ ˜ Jš œ œ$˜5—J˜———Jš œ˜J˜šคœ œ˜ ™ Jšœ  œ˜Jšœ  œ˜Jšœ œ˜Jšœ  œ˜J˜—šœ ™ Jšœ%˜%Jšœ,˜,Jšœ œ˜J˜—šœ!™!Jšœ  œ˜Jšœ œ˜Jšœ ˜J˜—J˜Jšค˜J˜š˜šœ ™ Jšœ  œ˜Jšœ œ˜Jšœ œ˜Jšœ'˜'Jšœ)˜)Jšœ*˜*Jšœ˜Jšœ œ˜"Jšœ œ˜Jšœ œ˜Jšœ  œ˜—J™™J˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ!˜!——J˜—Jš ˜™J™——…—).<ฆ