<> <> <> <> <> <> <> <<>> Directory DragonMicroPLA; Imports Dragon, DragonIFU; IPipe: CELL [ <> XBus =INT[32], Lev0PA EnumType["Dragon.CondSelects"], Lev3CaddrBA >INT[8], XBSourceBA > DontBypassBA BOOL, PopPendingAB >BOOL, ITrapEffectPendingAB >EnumType["DragonMicroPLA.ITrapPostEffect"], Lev3ITrapEffectBA >EnumType["DragonMicroPLA.ITrapPostEffect"], DelayACycleAB >BOOL, Lev2CondEffectBA >EnumType["DragonMicroPLA.CondEffect"], <> IStkPushBA >BOOL, IStkPopBA >BOOL, Lev3PBA >INT[32], Lev3LBA >INT[8], <> KBus =INT[32], -- PhA bidirectional, PhB A,B,C to EU EUAluLeftisR1BA >BOOL, -- Left Default is aRam 1B EUAluLeftisR3BA >BOOL, -- Left Default is aRam 1B EUAluRightisR1BA >BOOL, -- Right Default is bRam 1B EUAluRightisR3BA >BOOL, -- Right Default is bRam 1B EUAluRightisKBA >BOOL, -- Right Default is bRam 1B EUS1isR1BA >BOOL, -- Default is bRam 1B EUS1isR3BA >BOOL, -- Default is bRam 1B EUAluOpAB >EnumType["Dragon.ALUOps"], -- 2A EUCondSelAB >EnumType["Dragon.CondSelects"], -- 2A EUR2isR3BA >BOOL, -- Default is R1 2B EUS3isR3BA >BOOL, -- Default is S2 2B EUTrapBA >BOOL, -- Trap on conditon 2B EUHoldCarryBA >BOOL, -- Preserve carry EUR3isR2AB >BOOL, -- Default is RData 3A EUWriteToPBusAB >BOOL, -- Data direction 3A EUCheckPParityAB >BOOL, -- Yes for non-FP Fetch 3A <<>> <> FPCSLoadBA >EnumType["DragonFP.CSLoad"], FPCSUAluBA >EnumType["DragonFP.CSUnload"], FPCSUMultBA >EnumType["DragonFP.CSUnload"], <> EPCmdA >EnumType["Dragon.PBusCommands"], EPRejectB > <> ResetAB > <> RescheduleAB =k ELSE IF bc2 AND NOT read2 THEN r1 ELSE IF bc3 THEN r3 ELSE store1; result2 _ IF bc2 AND passRt THEN r3 ELSE result2; store3 _ IF bc2 THEN r3 ELSE store3; result3 _ IF read1 THEN rdata ELSE result3; } }; IF PhA AND NOT dHoldBA THEN { pipeInterlock:BOOL _ FALSE; input: DragonIFU.Level1 _ [ a : Lev0AaddrBA, b : Lev0BaddrBA, aluLt : aRam, aluRt : IF Lev0AluRtIsKBA THEN k ELSE bRam, store1 : bRam, ka : Dragon.LFD[XBus], aluOp : Lev0AluOpBA, condSel : Lev0CondSelBA, condOp : Lev0CondEffectBA, result2 : r1, store3 : s2, euPBus : Lev0EuPBusCmdBA, result3 : IF DragonIFU.IsRdCmd[Lev0EuPBusCmdBA] THEN rdata ELSE r2, c : Lev0CaddrA, iStackOp : Lev0IStackPostEffectBA, iTrapOp : Lev0ITrapPostEffectBA, p : Dragon.LFD[Lev0PA], l : Lev0LA, s : Lev0SA ]; IF killPipeBA THEN {delayed1[a] _ level1[a] _ []; level2[a] _ []; level3[a] _ []} ELSE IF level3RejectingBA THEN { level1[a] _ level1[b]; level2[a] _ level2[b]; level3[a] _ level3[b]; IF lastCycleDelayedBA THEN delayed1[a] _ delayed1[b] ELSE delayed1[a] _ input } ELSE { IF lastCycleDelayedBA THEN { delayed1[a] _ delayed1[b]; [pipeInterlock , level1[a]] _ Bypass[delayed1[b], level1[b], level2[b], level3[b], DontBypassBA] } ELSE { delayed1[a] _ input; [pipeInterlock , level1[a]] _ Bypass[input, level1[b], level2[b], level3[b], DontBypassBA] }; level2[a].ka _ level1[b].ka; level2[a].aluOp _ level1[b].aluOp; level2[a].condSel _ level1[b].condSel; level2[a].condOp _ level1[b].condOp; level2[a].result2 _ level1[b].result2; level2[a].store3 _ level1[b].store3; level2[a].euPBus _ level1[b].euPBus; level2[a].result3 _ level1[b].result3; level2[a].c _ level1[b].c; level2[a].iStackOp _ level1[b].iStackOp; level2[a].iTrapOp _ level1[b].iTrapOp; level2[a].p _ level1[b].p; level2[a].l _ level1[b].l; level2[a].s _ level1[b].s; level3[a].euPBus _ level2[b].euPBus; level3[a].result3 _ level2[b].result3; level3[a].c _ level2[b].c; level3[a].iStackOp _ level2[b].iStackOp; level3[a].iTrapOp _ level2[b].iTrapOp; level3[a].p _ level2[b].p; level3[a].l _ level2[b].l; level3[a].s _ level2[b].s; }; <> PushPendingAB _ delayed1[a].iStackOp=push OR level1[a].iStackOp=push OR level2[a].iStackOp=push OR level3[a].iStackOp=push; PopPendingAB _ delayed1[a].iStackOp=pop OR level1[a].iStackOp=pop OR level2[a].iStackOp=pop OR level3[a].iStackOp=pop; ITrapEffectPendingAB _ IF delayed1[a].iTrapOp#none THEN delayed1[a].iTrapOp ELSE IF level1[a].iTrapOp#none THEN level1[a].iTrapOp ELSE IF level2[a].iTrapOp#none THEN level2[a].iTrapOp ELSE level3[a].iTrapOp; DelayACycleAB _ level3RejectingBA OR pipeInterlock; <<>> EUAluOpAB _ level2[a].aluOp; EUCondSelAB _ level2[a].condSel; EPCmdA _ IF level3RejectingBA THEN NoOp ELSE level2[b].euPBus; EUWriteToPBusAB _ DragonIFU.IsWtCmd[level3[a].euPBus]; EUCheckPParityAB _ EUWriteToPBusAB AND NOT DragonIFU.IsFPCmd[level3[a].euPBus]; EUR3isR2AB _ level3[a].result3=r2; <<>> <> <> IF DragonIFU.BytetoPR[Lev3CaddrBA] IN [ifuXBus..ifuLast] THEN XBus _ KBus ELSE { IF DragonIFU.BytetoPR[Lev0BaddrBA] = ifuLevel3LS THEN XBus _ Dragon.LTD[level3[b].s*256 + level3[b].l]; IF level2[b].euPBus=StoreFP THEN KBus _ Dragon.LTD[level2[b].ka] ELSE KBus _ Dragon.LTD[level1[b].ka] } }; <<>> IF PhB THEN dHoldBA _ DHoldAB; IF PhB AND NOT DHoldAB THEN { <<>> <> delayed1[b] _ IF KillPipeAB THEN [] ELSE delayed1[a]; level1[b] _ IF KillPipeAB THEN [] ELSE level1[a]; level2[b] _ IF KillPipeAB THEN [] ELSE level2[a]; level3[b] _ IF KillPipeAB -- p l s must be preserved for restart THEN [p:level3[a].p, l:level3[a].l, s:level3[a].s] ELSE level3[a]; lastCycleDelayedBA _ DelayACycleAB; level3RejectingBA _ EPRejectB; killPipeBA _ KillPipeAB; <<>> <> Lev2CondEffectBA _ level2[b].condOp; Lev2CondSelBA _ level2[b].condSel; Lev3CaddrBA _ IF level3RejectingBA THEN DragonIFU.noStore ELSE level3[b].c; <> IStkPushBA _ IF level3RejectingBA THEN FALSE ELSE level3[b].iStackOp=push; IStkPopBA _ IF level3RejectingBA THEN FALSE ELSE level3[b].iStackOp=pop; Lev3ITrapEffectBA _ IF level3RejectingBA THEN none ELSE level3[b].iTrapOp; Lev3PBA _ Dragon.LTD[level3[b].p]; Lev3LBA _ level3[b].l; <> FPCSUAluBA _ IF NOT level3RejectingBA AND level1[b].euPBus=FetchFPAlu THEN unload ELSE dont; FPCSUMultBA _ IF NOT level3RejectingBA AND level1[b].euPBus=FetchFPMult THEN unload ELSE dont; FPCSLoadBA _ IF NOT level3RejectingBA AND level2[b].euPBus=StoreFP <> <> <> THEN load ELSE dont; <<>> <> KBus _ Dragon.LTD [(((level1[b].a*LONG[256]) + level1[b].b)*256 + level3[b].c)*256]; EUAluLeftisR1BA _ level1[b].aluLt=r1; EUAluLeftisR3BA _ level1[b].aluLt=r3; EUAluRightisR1BA _ level1[b].aluRt=r1; EUAluRightisR3BA _ level1[b].aluRt=r3; EUAluRightisKBA _ level1[b].aluRt=k; EUS1isR1BA _ level1[b].store1=r1; EUS1isR3BA _ level1[b].store1=r3; EUR2isR3BA _ level2[b].result2=r3; EUS3isR3BA _ level2[b].store3=r3; EUTrapBA _ level2[b].condOp # microJump; EUHoldCarryBA _ killPipeBA; <<>> <> IF XBSourceBA = pipe3PC THEN XBus _ Dragon.LTD[level3[b].p]; } ENDCELL