DIRECTORY Commander, Dragon, DragonMicroPLA, DragOpsCross, IO; DragonMicroPLAImplA: CEDAR PROGRAM IMPORTS DragonMicroPLA, IO, Commander, Dragon EXPORTS DragonMicroPLA = BEGIN OPEN DragonMicroPLA, DragOpsCross; PLAMinterms: PUBLIC [0..MaxPLAMinterms) _ 0; opCodeMap: PUBLIC PACKED ARRAY [0..256) OF BoolFalse; PLA: PUBLIC REF PLAType ~ NEW[PLAType]; GeneratePLA: PUBLIC PROC = { sigphBArgs: SigPhBArgs _ SigPhBArgsFalse; m: MicroInst; phBArgs: PhBArgs; PlaRowPointer: PUBLIC [0..MaxPLAMinterms) _ 0; PLAMinterms _ 0; FOR opcode:Dragon.Opcode IN [0..256) DO opCodeMap[opcode] _ FALSE; ENDLOOP; sigphBArgs.state.exceptions _ TRUE; phBArgs.state.exceptions _ aboutToReset; m _ [ doMacroJump: FALSE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, lSource: [ zero, one ], sSource: [ zero, zero ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ reset; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, lSource: [ zero, one ], sSource: [ zero, zero ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ euCC; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, xASource: bAddrIFUReg, bReg: ifuLevel3LS, lSource: [ xBus, zero ], sSource: [ xBus, zero ], pushLevel3: TRUE ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ epFault; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ epReject; m _ NoOpMicro; m.delayed _ TRUE; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ cJump; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pipe3PC, xASource: bAddrIFUReg, bReg: ifuLevel3LS, lSource: [ xBus, zero ], sSource: [ xBus, zero ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ none; sigphBArgs.delayACycle _ TRUE; phBArgs.delayACycle _ TRUE; m _ NoOpMicro; m.delayed _ TRUE; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.delayACycle _ FALSE; sigphBArgs.state.cycle _ TRUE; sigphBArgs.op _ SigInstByteTrue; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, minus1 ], -- Product.msw bReg: [ s, zero ], -- Multiplicand cReg: [ s, minus1 ], -- Product.msw aluOp: MulStep ]; FOR cycle:INT IN [1..16] DO phBArgs.state.cycle _ cycle; phBArgs.op _ dMUL; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dUMUL; AddPLARow[ sigphBArgs, phBArgs, m]; ENDLOOP; phBArgs.state.cycle _ 17; phBArgs.op _ dUMUL; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, minus1 ], -- Product.msw bReg: [ s, zero ], -- Multiplicand cReg: [ s, minus1 ], -- Product.msw aluOp: MulAdj ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMUL; m _ [ dontGetNextMacro: FALSE, cReg: [ s, zero ], -- Product.lsw _ MQ aluOp: RdMQ ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 18; -- dUMUL 18 same as dMUL 17 phBArgs.op _ dUMUL; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 32; -- Target of microjump m _ [ aReg: constantZero, -- Product.msw bReg: constantZero, -- Multiplicand cReg: [ s, minus1 ], -- Product.msw _ 0 aluOp: Or ]; phBArgs.op _ dMUL; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dUMUL; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 1; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, one ], -- Dividend.msw (temp location) bReg: [ s, zero ], -- Divisor cReg: [ s, one ] ]; -- Dividend.msw (temp location) m.aluOp _ DivLdS; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; m.aluOp _ DivLdU; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, one ], -- Dividend.msw (temp location) bReg: [ s, zero ], -- Divisor cReg: [ s, minus1 ], -- Remainder destination condSel: DivOvFl, condEffect: macroTrap ]; m.aluOp _ DivCkU; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; m.aluOp _ DivCkS; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, minus1 ], -- Remainder source bReg: [ s, zero ], -- Divisor cReg: [ s, minus1 ], -- Remainder destination aluOp: DivStep ]; FOR cycle: INT IN [3..33] DO phBArgs.state.cycle _ cycle; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; ENDLOOP; phBArgs.state.cycle _ 34; m.aluOp _ DivAdjM; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; m.aluOp _ DivAdjR; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 35; m.aluOp _ DivAdj; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 36; m _ [ dontGetNextMacro: TRUE, xBSource: pc, cReg: [ s, minus2 ], -- Quotient destination aluOp: RdMQ ]; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 37; m _ [ dontGetNextMacro: FALSE, aReg: [ s, minus2 ], -- Quotient source bReg: constantZero, -- Zero cReg: [ s, minus2 ], -- Quotient destination deltaSa: pop, aluOp: SAdd ]; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dFP; phBArgs.state.cycle _ 1; m _ [dontGetNextMacro: FALSE]; FPAddPLARow[ setMode, sigphBArgs, phBArgs, m]; m _ NoOpMicro; FPAddPLARow[ sglUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, minus1 ], xASource: fpLdAMsw, euPBusCmd: StoreFP ]; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, minus1 ], xASource: fpLdBMsw, euPBusCmd: StoreFP ]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; m _ NoOpMicro; FPAddPLARow[ sglUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, minus2 ], xASource: fpLdALsw, euPBusCmd: StoreFP ]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; m _ NoOpMicro; FPAddPLARow[ sglUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, minus3 ], xASource: fpLdAMsw, euPBusCmd: StoreFP ]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 4; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ sglUnCom, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: FALSE, cReg: [ s, zero ], xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ sglUnAlu, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, cReg: [ s, zero ], xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; m _ NoOpMicro; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 5; m _ [ dontGetNextMacro: FALSE, deltaSc: push, cReg: [ s, one ], xASource: fpUnldLsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, deltaSb: pop, xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, cReg: [ s, minus1 ], xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, cReg: [ s, minus1 ], xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, cReg: [ s, minus1 ], xASource: fpUnldMsw, euPBusCmd: FetchFPMult ]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; m _ NoOpMicro; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 6; m _ [ dontGetNextMacro: FALSE, cReg: [ s, zero ], xASource: fpUnldLsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; m _ NoOpMicro; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 7; m _ [ dontGetNextMacro: TRUE, xBSource: pc, deltaSa: pop, deltaSb: pop, -- Two more left for next cycle xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, cReg: [ s, minus3 ], xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; m _ NoOpMicro; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 8; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, deltaSb: pop, -- Last two xASource: fpUnldMsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, deltaSb: pop, cReg: [ s, minus2 ], xASource: fpUnldLsw, euPBusCmd: FetchFPAlu ]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, cReg: [ s, minus3 ], xASource: fpUnldMsw, euPBusCmd: FetchFPMult ]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 9; m _ [ dontGetNextMacro: FALSE, deltaSa: pop, deltaSb: pop, cReg: [ s, minus2 ], xASource: fpUnldLsw, euPBusCmd: FetchFPMult ]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; sigphBArgs.alpha _ SigInstByteFalse; phBArgs.op _ dSIFUR; phBArgs.state.cycle _ 1; m _ NoOpMicro; -- to allow ALU result to reach Result3 AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; m _ [ dontGetNextMacro: FALSE, deltaSa: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSJ; phBArgs.state.cycle _ 1; m _ NoOpMicro; -- to allow Xa to latch Result3 AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 4; -- S _ S-1 m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pcPlusXA, deltaSa: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSFC; phBArgs.state.cycle _ 1; m _ NoOpMicro; -- to allow Xa to latch Result3 AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 4; -- S _ S-1 m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: xA, deltaSa: pop, pipedPLSASpec: pLenLSnext, iStackPostEffect: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSFCI; phBArgs.state.cycle _ 1; m _ NoOpMicro; -- to allow Xa to latch Result3 AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 4; -- S _ S-1 m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: xA, pipedPLSASpec: pLenLSnext, iStackPostEffect: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dCST; phBArgs.state.cycle _ 1; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, one ], bReg: abStackTop, aluOp: VSub, condSel: EZ, condEffect: microJump ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 2; m _ NoOpMicro; -- Allow ALU result to get back AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 3; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 4; -- [] _ ([S-2]+alpha)^, release hold, S _ S+1 m _ [ aReg: [ s, minus2 ], xASource: alpha, aluRtIsK: TRUE, deltaSc: push, aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 32; -- target of microjump, ([S-2]+alpha)^ _ [S-1], release hold, S _ S+1 m _ [ aReg: [ s, minus2 ], bReg: [ s, minus1 ], xASource: alpha, aluRtIsK: TRUE, deltaSc: push, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dEXCH; phBArgs.state.cycle _ 1; m _ [ dontBypass: TRUE, bReg: [ s, minus1 ], cReg: cStackTop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.cycle _ 0; sigphBArgs.op _ SigInstByteFalse; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, iStackPostEffect: push, iTrapPostEffect: disable ]; phBArgs.state.exceptions _ rschlWait; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ iStkOFlow; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ eStkOFlow; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ iFtchFault; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.state.exceptions _ none; sigphBArgs.instReady _ TRUE; phBArgs.instReady _ FALSE; m _ NoOpMicro; m.delayed _ TRUE; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.instReady _ TRUE; sigphBArgs.pushPending _ TRUE; phBArgs.pushPending _ TRUE; sigphBArgs.op _ SigInstByteTrue; phBArgs.op _ dRET; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETT; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETN; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIFUR; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.pushPending _ FALSE; sigphBArgs.popPending _ TRUE; phBArgs.popPending _ TRUE; phBArgs.op _ dRET; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETT; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETN; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIFUR; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dEP; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.popPending _ FALSE; sigphBArgs.iStkEmpty _ TRUE; phBArgs.iStkEmpty _ TRUE; sigphBArgs.pushPending _ TRUE; phBArgs.pushPending _ FALSE; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, lSource: [ s, alpha ], pipedPLSASpec: pLenLSnext, iStackPostEffect: push, -- this push differentiates this trap from the following iTrapPostEffect: disable ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.popPending _ TRUE; phBArgs.popPending _ FALSE; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: trapPCGenerator, sSource: [ l, alpha ], iTrapPostEffect: disable ]; phBArgs.op _ dRET; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETT; m.sSource _ [ s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETN; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.iStkEmpty _ FALSE; sigphBArgs.popPending _ FALSE; sigphBArgs.pushPending _ FALSE; Generate1PLA[sigphBArgs, phBArgs]; -- Arbitrary break }; -- of GeneratePLA Generate1PLA: PROC [sigphBArgs: SigPhBArgs, phBArgs: PhBArgs] = { m: MicroInst _ DefaultMicro; phBArgs.op _ dJEBB; m _ [ aReg: abStackTop, xASource: beta, aluRtIsK: TRUE, deltaSa: pop, aluOp: VSub, condEffect: macroJump, condSel: EZ, doMacroJump: FALSE, dontGetNextMacro: FALSE, xBSource: pcPlusLen, pipedPLSASpec: pAlphasLSnext]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJNEBB; m.condSel _ NE; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJEBBJ; m.doMacroJump _ TRUE; m.dontGetNextMacro _ TRUE; m.xBSource _ pcPlusAlphaS; m.pipedPLSASpec _ pLenLSnext; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJNEBBJ; m.condSel _ EZ; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRJEB; sigphBArgs.op.bit5 _ FALSE; -- Bit 4 distinguishes dRJEB from dRJEBJ sigphBArgs.op.bit6 _ FALSE; sigphBArgs.op.bit7 _ FALSE; m _ [ aluOp: VSub, condSel: op57, condEffect: macroJump, doMacroJump: FALSE, dontGetNextMacro: FALSE, xBSource: pcPlusLen, pipedPLSASpec: pAlphasLSnext]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRJEBJ; m _ [ aluOp: VSub, condSel: op57, condEffect: macroJump, doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pcPlusAlphaS, pipedPLSASpec: pLenLSnext]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op.bit4 _ FALSE; sigphBArgs.beta.bit1 _ TRUE; -- sd phBArgs.beta _ 377B; m _ BlankMicro; m.aReg _ [ s, minus1 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 0; m.aReg _ [ s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit1 _ FALSE; -- sd sigphBArgs.beta.bit2 _ TRUE; -- opt sigphBArgs.beta.bit4 _ TRUE; -- reg.bit0 sigphBArgs.beta.bit5 _ TRUE; -- reg.bit1 m _ BlankMicro; m.bReg _ [cBase, beta47 ]; phBArgs.beta _ 40B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 44B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 50B; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit7 _ TRUE; phBArgs.beta _ 54B; m.bReg _ [s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 55B; m.bReg _ [s, minus1 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit3 _ TRUE; -- aux sigphBArgs.beta.bit4 _ FALSE; -- reg.bit0 sigphBArgs.beta.bit5 _ FALSE; -- reg.bit1 sigphBArgs.beta.bit7 _ FALSE; -- reg.bit3 phBArgs.beta _ 0B; m.bReg _ [l, beta47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 20B; m.bReg _ [aBase, beta47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta _ SigInstByteFalse; phBArgs.beta _ 257B; m _ BlankMicro; m.deltaSa _ pop; sigphBArgs.beta.bit0 _ TRUE; -- sdd AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit0 _ FALSE; -- sdd sigphBArgs.beta.bit2 _ TRUE; -- opt sigphBArgs.beta.bit4 _ TRUE; -- reg.bit0 sigphBArgs.beta.bit5 _ TRUE; -- reg.bit1 sigphBArgs.beta.bit6 _ TRUE; -- reg.bit2 m _ BlankMicro; m.deltaSb _ pop; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta _ SigInstByteFalse; sigphBArgs.op _ SigInstByteTrue; m _ DefaultMicro; phBArgs.op _ dJ1; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJ2; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJ3; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJ5; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJB; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pcPlusAlphaS ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dJDB; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pcPlusBetaAlphaS ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dDJ; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: deltaGammaBetaAlpha ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSJ; m _ [ -- ifuXBus _ [S] dontGetNextMacro: TRUE, xBSource: pc, bReg: abStackTop, cReg: ifuXBus ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRET; sigphBArgs.pushPending _ TRUE; phBArgs.pushPending _ FALSE; sigphBArgs.popPending _ TRUE; phBArgs.popPending _ FALSE; sigphBArgs.iStkEmpty _ TRUE; phBArgs.iStkEmpty _ FALSE; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: iStackPC, xASource: bAddrIFUReg, bReg: ifuYoungestL, lSource: [ xBus, zero ], sSource: [ l, alpha ], iStackPostEffect: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETN; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: iStackPC, xASource: bAddrIFUReg, bReg: ifuYoungestL, lSource: [ xBus, zero ], iStackPostEffect: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRETT; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: iStackPC, xASource: bAddrIFUReg, bReg: ifuYoungestL, lSource: [ xBus, zero ], iStackPostEffect: pop, iTrapPostEffect: enable ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.pushPending _ FALSE; sigphBArgs.popPending _ FALSE; sigphBArgs.iStkEmpty _ FALSE; phBArgs.op _ dLFC; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: pcPlusBetaAlphaS, pipedPLSASpec: pLenLSnext, iStackPostEffect: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dDFC; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: deltaGammaBetaAlpha, pipedPLSASpec: pLenLSnext, iStackPostEffect: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSFC; m _ [ -- ifuXBus _ [S] dontGetNextMacro: TRUE, xBSource: pc, bReg: abStackTop, cReg: ifuXBus ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSFCI; m _ [ -- ifuXBus _ [S]^ dontGetNextMacro: TRUE, xBSource: pc, bReg: abStackTop, cReg: ifuXBus, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dIN; m _ [ aReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, cReg: cStackTop, aluOp: VAdd, euPBusCmd: IOFetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRB; m _ [ aReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, cReg: cStackTop, aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRSB; m _ [ aReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push, aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLRI0; sigphBArgs.op.bit4 _ FALSE; sigphBArgs.op.bit5 _ FALSE; sigphBArgs.op.bit6 _ FALSE; sigphBArgs.op.bit7 _ FALSE; m _ [ aReg: [ l, op47 ], xASource: alpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push, aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op _ SigInstByteTrue; phBArgs.op _ dLGF; m _ [ aReg: euGF, xASource: betaAlpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push, aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRRI; m _ [ aReg: [ l, beta47], xASource: alpha, aluRtIsK: TRUE, cReg: [ l, beta03 ], aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRAI; m _ [ aReg: [ aBase, beta47], xASource: alpha, aluRtIsK: TRUE, cReg: [ l, beta03 ], aluOp: VAdd, euPBusCmd: Fetch ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dCST; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, minus2 ], xASource: alpha, aluRtIsK: TRUE, cReg: [ s, one ], aluOp: VAdd, euPBusCmd: FetchHold ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dOUT; m _ [ aReg: abStackTop, bReg: [ s, minus1 ], xASource: alpha, aluRtIsK: TRUE, deltaSa: pop, deltaSb: pop, aluOp: VAdd, euPBusCmd: IOStore ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dWB; m _ [ aReg: abStackTop, bReg: [ s, minus1 ], xASource: alpha, aluRtIsK: TRUE, deltaSa: pop, deltaSb: pop, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dWSB; m _ [ aReg: [ s, minus1 ], bReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, deltaSa: pop, deltaSb: pop, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dPSB; m _ [ aReg: [ s, minus1 ], bReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, deltaSa: pop, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSRI0; sigphBArgs.op.bit4 _ FALSE; sigphBArgs.op.bit5 _ FALSE; sigphBArgs.op.bit6 _ FALSE; sigphBArgs.op.bit7 _ FALSE; m _ [ aReg: [ l, op47 ], bReg: [ s, zero ], xASource: alpha, aluRtIsK: TRUE, deltaSb: pop, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op _ SigInstByteTrue; phBArgs.op _ dWRI; m _ [ aReg: [ l, beta47], bReg: [ l, beta03 ], xASource: alpha, aluRtIsK: TRUE, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dWAI; m _ [ aReg: [ aBase, beta47], bReg: [ l, beta03 ], xASource: alpha, aluRtIsK: TRUE, aluOp: VAdd, euPBusCmd: Store ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dDIS; m _ [deltaSa: pop]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dAS; m _ [sSource: [s, alpha]]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dAL; m _ [lSource: [l, alpha]]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dASL; m _ [sSource: [ l, alpha]]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dEP; m _ [lSource: [ s, alpha]]; sigphBArgs.popPending _ TRUE; phBArgs.popPending _ FALSE; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.popPending _ FALSE; sigphBArgs.pushPending _ TRUE; phBArgs.pushPending _ TRUE; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.pushPending _ FALSE; sigphBArgs.iStkEmpty _ TRUE; phBArgs.iStkEmpty _ FALSE; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.iStkEmpty _ FALSE; phBArgs.op _ dFSDB; m _ [ xASource: betaAlpha, aluRtIsK: TRUE, cReg: euField ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIB; m _ [ xASource: alpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIDB; m _ [ xASource: betaAlpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIQB; m _ [ xASource: deltaGammaBetaAlpha, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLC0; sigphBArgs.op.bit5 _ FALSE; sigphBArgs.op.bit6 _ FALSE; sigphBArgs.op.bit7 _ FALSE; m _ [ bReg: [ cBase, op47 ], cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLR0; sigphBArgs.op.bit4 _FALSE; m _ [ bReg: [ l, op47 ], cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSR0; m _ [ bReg: [ s, zero ], cReg: [ l, op47 ], deltaSb: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op _ SigInstByteTrue; phBArgs.op _ dDUP; m _ [ bReg: abStackTop, cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dEXDIS; m _ [ bReg: abStackTop, cReg: [ s, minus1 ], deltaSa: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dEXCH; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: abStackTop, cReg: [ s, minus1 ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSEUR; m _ [ bReg: abStackTop, cReg: [ zero, alpha ], deltaSb: pop ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSIFUR; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: abStackTop, cReg: [ zero, alpha ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLEUR; m _ [ bReg: [ zero, alpha ], cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dLIFUR; sigphBArgs.pushPending _ TRUE; phBArgs.pushPending _ FALSE; m _ [ bReg: [zero, alpha], xASource: bAddrIFUReg, aluRtIsK: TRUE, cReg: [ s, one ], deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.pushPending _ FALSE; sigphBArgs.popPending _ TRUE; phBArgs.popPending _ FALSE; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.popPending _ FALSE; phBArgs.op _ dADDB; m _ [ aReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, cReg: cStackTop, aluOp: SAdd, condSel: OvFl ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dADDDB; m _ [ aReg: abStackTop, xASource: betaAlpha, aluRtIsK: TRUE, cReg: cStackTop, aluOp: SAdd, condSel: OvFl ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSUBB; m _ [ aReg: abStackTop, xASource: alpha, aluRtIsK: TRUE, cReg: cStackTop, aluOp: SSub, condSel: OvFl ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSHL; m _ [ aReg: abStackTop, bReg: [ cBase, zero ], xASource: betaAlpha, cReg: cStackTop, aluOp: FOPK ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSHR; m _ [ aReg: abStackTop, bReg: [ s, zero ], xASource: betaAlpha, cReg: cStackTop, aluOp: FOPK ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dADD; m _ [ aReg: [ s, minus1 ], bReg: abStackTop, cReg: [ s, minus1 ], deltaSa: pop, aluOp: SAdd, condSel: OvFl, condEffect: macroTrap ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dSUB; m _ [ aReg: [ s, minus1 ], bReg: [ s, zero ], cReg: [ s, minus1 ], deltaSa: pop, aluOp: SSub, condSel: OvFl, condEffect: macroTrap ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dMUL; m _ [-- MCandSign _ LtSign dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, zero ], -- Lt _ S=Multiplicand bReg: [ s, minus1 ], -- MQ _ Rt _ Multiplier cReg: [ s, minus1 ], -- Product.msw condSel: EZ, -- IF aluout=Lt=Multiplicand is zero then quit condEffect: microJump]; -- cycle _ 32 if zero m.aluOp _ MulLdS; phBArgs.op _ dMUL; AddPLARow[ sigphBArgs, phBArgs, m]; m.aluOp _ MulLdU; phBArgs.op _ dUMUL; AddPLARow[ sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, aReg: [ s, minus2 ], -- Dividend MSW bReg: [ s, minus1 ], -- Dividend LSW cReg: [ s, one ], aluOp: DivLdDbl]; phBArgs.op _ dMDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRDIV; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dUDIV; AddPLARow[ sigphBArgs, phBArgs, m]; Generate2PLA[sigphBArgs, phBArgs]; -- Arbitrary break }; -- of Generate1PLA Generate2PLA: PROC [sigphBArgs: SigPhBArgs, phBArgs: PhBArgs] = { m: MicroInst _ DefaultMicro; phBArgs.op _ dFP; m _ [ dontGetNextMacro: TRUE, -- delay one for KBus contention xBSource: pc, xASource: fpLdMode, euPBusCmd: StoreFP]; FPAddPLARow[ setMode, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, zero ], xASource: fpLdAMsw, euPBusCmd: StoreFP]; FPAddPLARow[ sglUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglUnCvt, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, zero ], xASource: fpLdALsw, euPBusCmd: StoreFP]; FPAddPLARow[ dblUnCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblUnCvt, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, zero ], xASource: fpLdBMsw, euPBusCmd: StoreFP]; FPAddPLARow[ sglBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ sglBiMult, sigphBArgs, phBArgs, m]; m _ [ dontGetNextMacro: TRUE, xBSource: pc, bReg: [ s, zero ], xASource: fpLdBLsw, euPBusCmd: StoreFP]; FPAddPLARow[ dblBiCom, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiAlu, sigphBArgs, phBArgs, m]; FPAddPLARow[ dblBiMult, sigphBArgs, phBArgs, m]; phBArgs.op _ dBNDCK; m _ [ aReg: [ s, minus1 ], bReg: [ s, zero ], deltaSa: pop, aluOp: VSub, -- This does not need to be BndChk since cReg is not used condSel: BC, condEffect: macroTrap ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRADD; sigphBArgs.op.bit4 _ FALSE; sigphBArgs.op.bit5 _ FALSE; sigphBArgs.op.bit6 _ FALSE; sigphBArgs.op.bit7 _ FALSE; m _ DefaultMicro; sigphBArgs.beta.bit0 _ TRUE; -- aOpt sigphBArgs.beta.bit3 _ TRUE; -- aux phBArgs.beta _ 0B; m.aReg _ [l, alpha47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 20B; -- aux m.aReg _ [aBase, alpha47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit3 _ FALSE; -- aux phBArgs.beta _ 200B; sigphBArgs.alpha.bit4 _ TRUE; -- a0 sigphBArgs.alpha.bit5 _ TRUE; -- a1 m.aReg _ [cBase, alpha47 ]; phBArgs.alpha _ 0B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 4B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 10B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 16B; sigphBArgs.alpha.bit7 _ TRUE; --a3 m.aReg _ [s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 17B; m.aReg _ [s, minus1 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.alpha.bit7 _ FALSE; --a3 sigphBArgs.alpha.bit6 _ TRUE; --a2 m _ BlankMicro; m.deltaSa _ pop; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.alpha _ SigInstByteFalse; sigphBArgs.beta _ SigInstByteFalse; sigphBArgs.beta.bit2 _ TRUE; -- bOpt sigphBArgs.beta.bit3 _ TRUE; -- aux phBArgs.beta _ 0B; m _ BlankMicro; m.bReg _ [l, beta47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 20B; -- aux m.bReg _ [aBase, beta47 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit3 _ FALSE; phBArgs.beta _ 40B; sigphBArgs.beta.bit4 _ TRUE; -- b0 sigphBArgs.beta.bit5 _ TRUE; -- b1 m.bReg _ [cBase, beta47 ]; phBArgs.beta _ 40B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 44B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 50B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 54B; sigphBArgs.beta.bit7 _ TRUE; -- b3 m.bReg _ [s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 57B; m.bReg _ [s, minus1 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit7 _ FALSE; --b3 sigphBArgs.beta.bit6 _ TRUE; --b2 m _ BlankMicro; m.deltaSb _ pop; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta _ SigInstByteFalse; sigphBArgs.beta.bit1 _ TRUE; -- cOpt sigphBArgs.beta.bit3 _ TRUE; -- aux phBArgs.beta _ 0B; m _ BlankMicro; m.cReg _ [l, alpha03 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.beta _ 20B; -- aux m.cReg _ [aBase, alpha03 ]; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.beta.bit3 _ FALSE; phBArgs.beta _ 100B; sigphBArgs.alpha.bit0 _ TRUE; -- c0 sigphBArgs.alpha.bit1 _ TRUE; -- c1 m.cReg _ [cBase, alpha03 ]; phBArgs.alpha _ 0B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 100B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 200B; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 300B; sigphBArgs.alpha.bit2 _ TRUE; --c2 sigphBArgs.alpha.bit3 _ TRUE; -- c3 m.cReg _ [s, zero ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 320B; m.cReg _ [s, minus1 ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 340B; m.cReg _ [s, one ]; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.alpha _ 360B; m.deltaSc _ push; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.alpha _ SigInstByteFalse; sigphBArgs.beta _ SigInstByteFalse; m _ BlankMicro; m.aluOp _ op47; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op.bit4 _ TRUE; sigphBArgs.op.bit5 _ TRUE; sigphBArgs.op.bit6 _ TRUE; phBArgs.op _ dRADD; -- or dRSUB m _ BlankMicro; m.condSel _ OvFl; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRLADD; -- or dRLSUB m.condSel _ IL; AddPLARow[ sigphBArgs, phBArgs, m]; sigphBArgs.op _ SigInstByteTrue; phBArgs.op _ dRRX; m _ BlankMicro; m.aluOp _ VAdd; m.euPBusCmd _ Fetch; AddPLARow[ sigphBArgs, phBArgs, m]; phBArgs.op _ dRBC; m _ BlankMicro; m.condSel _ BC; m.condEffect _ macroTrap; AddPLARow[ sigphBArgs, phBArgs, m]; FOR opcode:Dragon.Opcode IN [0..256) DO oplength: [0..5] _ Dragon.OpLength [ opcode ]; IF opCodeMap[opcode] THEN LOOP; TRUSTED {phBArgs.op _ LOOPHOLE [opcode]; }; phBArgs.state.cycle _ 0; IF oplength=1 THEN m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: xopGenerator, pipedPLSASpec: pLenLSnext, iStackPostEffect: push ] ELSE m _ [ dontGetNextMacro: TRUE, xBSource: pc, xASource: deltaGammaBetaAlpha, aluRtIsK: TRUE, cReg: [ s, one ] ]; AddPLARow[ sigphBArgs, phBArgs, m]; IF oplength>1 THEN { phBArgs.state.cycle _ 1; m _ [ doMacroJump: TRUE, dontGetNextMacro: TRUE, xBSource: xopGenerator, pipedPLSASpec: pLenLSnext, iStackPostEffect: push, deltaSc: push ]; AddPLARow[ sigphBArgs, phBArgs, m]; }; ENDLOOP; }; -- of Generate2PLA PrintTotal: Commander.CommandProc = { screen: IO.STREAM _ cmd.out; screen.PutF["There were %g Microcode minterms generated.\n", IO.int[PLAMinterms]]; }; Commander.Register [ key: "PLASize", proc: PrintTotal, doc: "Size of Dragon Microcode PLA."]; END. ถDragonMicroPLAImplA.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Last edited by TWilliams, August 27, 1984 4:58:00 pm PDT Last edited by Curry, September 4, 1984 12:33:34 pm PDT dMUL and dUMUL d*DIV phBArgs.state.cycle _ 3..33 S _ S-1 EU driving ifu XBus during A with S IFU internal destination specified by level 3 cAddr deltaS: 0, -- shouldn't SFCI pop S? This cycle will invariably be Delayed (automatically) by the pipe since cycle 0 was a fetch into S+1 -- IF [S+1] = [S] THEN double microPC Remember that when doing microjumps, you can't get next macro until the condition has been tested since the opcode must be the same (cycles 2 and 3 above are necessary). This could be changed fairly easily to be similar to macro conditional jumps where the condition true means restart the instruction at cycle 32. phBArgs.op _ dEP; -- IStack Underflow is the default for trapPC IStack Underflow is the default for trapPC Save me for lisp dRRX is with the RR instructions d*DIV We have purposely defined the last four bits of dRRX(1000) such that oring VAdd(1100) converts its RR generated aluOp into VAdd(1100). Now Do the generation of the XOP based upon all unused opcodes. สJšœก˜-—šœ˜Jšœ6˜6—šœ˜Jšœ7˜7——J˜šœ™šœ˜JšœŸœ˜Jšœ ˜ Jšœก˜%Jšœก˜%Jšœ˜Jšœ˜—Jšœ7˜7Jšœ7˜7Jšœ7˜7—J˜J–20 sp tabStopsšœ#ก˜5J–20 sp tabStopsšœก  ˜J–20 sp tabStops˜—š  œŸœ/˜BJ˜Jšœ˜J˜šœ˜šœ˜JšœŸœก ˜9Jšœ˜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šœ0˜0šœ˜JšœŸœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ/˜/Jšœ/˜/Jšœ0˜0J˜—šœ˜šœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ก9˜FJšœ Ÿœ˜ Jšœ˜—J–20 sp tabStopsšœ#˜#—J˜Jšœ˜JšœŸœ˜JšœŸœ˜JšœŸœ˜JšœŸœ˜šœ˜J–20 sp tabStopsšœŸœก˜$–20 sp tabStopsšœŸœก˜#–20 sp tabStopsšœ˜J˜J–20 sp tabStopsšœ#˜#—–20 sp tabStopsšœก˜J˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœŸœก˜$J–20 sp tabStopsšœ˜J–20 sp tabStopsšœŸœก˜#J–20 sp tabStopsšœŸœก˜#˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜–20 sp tabStopsšœŸœก˜"J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœŸœก˜#—–20 sp tabStopsšœŸœก˜"J–20 sp tabStops˜J–20 sp tabStops˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœ$˜$J–20 sp tabStopsšœ$˜$——J–20 sp tabStopsšœŸœก˜$–20 sp tabStopsšœŸœก˜#–20 sp tabStopsšœ˜Jšœ˜J˜J–20 sp tabStopsšœ#˜#—–20 sp tabStopsšœก˜J˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœŸœ˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœŸœก˜"J–20 sp tabStopsšœŸœก˜"˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜–20 sp tabStopsšœŸœก˜"J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœŸœก˜"—–20 sp tabStopsšœŸœก˜!J–20 sp tabStops˜J–20 sp tabStops˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœ$˜$——J–20 sp tabStopsšœŸœก˜$–20 sp tabStopsšœŸœก˜#–20 sp tabStopsšœ˜Jšœ˜J˜J–20 sp tabStopsšœ#˜#—–20 sp tabStopsšœก˜J˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœŸœ˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœŸก˜#J–20 sp tabStopsšœŸก˜#˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J–20 sp tabStopsšœŸœก˜"–20 sp tabStopsšœŸœก˜#J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J˜J–20 sp tabStopsšœ#˜#J–20 sp tabStopsšœ˜J˜Jšœ#˜#J–20 sp tabStopsšœ˜J˜J–20 sp tabStopsšœ#˜#—J–20 sp tabStopsšœ$˜$J–20 sp tabStopsšœ$˜$——Jšœ˜Jšœ˜J–20 sp tabStopsšœ$˜$JšœŸœ˜JšœŸœ˜šœŸœ˜šœก ˜Jšœ˜J–20 sp tabStopsšœ˜J–20 sp tabStopsšœ#˜#—–20 sp tabStopsšœก ˜!J–20 sp tabStopsšœ Ÿœ˜J–20 sp tabStopsšœ#˜#J–20 sp tabStops˜——J–20 sp tabStopsšœ†™†J–20 sp tabStops˜J–20 sp tabStopsšœ ˜ šœ˜Jšœ˜Jšœ˜Jšœ˜J–20 sp tabStopsšœ#˜#J˜—šœ˜Jšœ˜Jšœ Ÿœ˜Jšœ˜J–20 sp tabStopsšœ#˜#J˜——Jšœ?™?šŸœŸœ Ÿ˜'Jšœ.˜.JšŸœŸœŸœ˜JšŸœŸœ ˜+J–20 sp tabStopsšœ˜šŸœ Ÿ˜˜Jšœ Ÿœ˜JšœŸœ˜Jšœ˜Jšœ˜Jšœ˜—šŸœ˜ JšœŸœ˜Jšœ ˜ Jšœ˜Jšœ Ÿœ˜Jšœ˜——J–20 sp tabStopsšœ#˜#šŸœ Ÿœ˜J–20 sp tabStopsšœ˜šœ˜Jšœ Ÿœ˜JšœŸœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—J–20 sp tabStopsšœ#˜#J–20 sp tabStops˜—J–20 sp tabStopsšŸœ˜—J–20 sp tabStops˜J–20 sp tabStopsšœก  œ˜—šœ%˜%JšœŸœŸœ ˜Jšœ=Ÿœ˜RJ˜J˜—Jšœ]˜]J˜JšŸœ˜˜J˜———…—Œจอม