DIRECTORY Commander, IFUPLAMainPipeControl, IO, PLAOps; IFUPLAMainPipeControlImpl: CEDAR PROGRAM IMPORTS Commander, IO, PLAOps = BEGIN OPEN PO: PLAOps; MainPipeControlIn: TYPE = IFUPLAMainPipeControl.MainPipeControlIn; MainPipeControlOut: TYPE = IFUPLAMainPipeControl.MainPipeControlOut; CondEffect: TYPE = IFUPLAMainPipeControl.CondEffect; MainPipeControlPLA: PO.PLA; MainPipeControlProc: PROC[argRec: MainPipeControlIn] RETURNS [resRec: MainPipeControlOut] = { arg: REF MainPipeControlIn _ NARROW[MainPipeControlPLA.data]; res: REF MainPipeControlOut _ NARROW[MainPipeControlPLA.out]; arg^ _ argRec; PO.GetOutForData[MainPipeControlPLA]; resRec _ res^}; condEffectIsSig: CondEffect _ LAST [CondEffect]; forceBubble: MainPipeControlOut = [microExcptJmp: bubble, except: [specialCode, bubble]]; GenPhBOutputs: PROC = { maskableTrap: PO.BoolExpr _ PO.And[ BETrue[[trapsEnabled2: TRUE]], PO.Or[ BETrue[[eStkOverflow2: TRUE]], PO.And[ BETrue[[instStarting2: TRUE]], BETrue[[rschWaiting: TRUE]] ], PO.And[ BETrue[[push2: TRUE]], BETrue[[iStkNearlyFull: TRUE]] ] ] ]; stage2Failed: PO.BoolExpr _ PO.Or[ BETrue[[reset: TRUE]], BETrue[[stage2BAbort: TRUE]], PO.And[ BETrue[[eUCondition2: TRUE]], BE[m:[condEffect2: condEffectIsSig], d:[condEffect2: macroTrap]] ], maskableTrap ]; stage2FailedOr1Hold: PO.BoolExpr _ PO.Or[ stage2Failed, BETrue[[stage1BHold: TRUE]] ]; loadStage1: PO.BoolExpr _ PO.Or[ BEFalse[[microExcptJmpBubble: TRUE]], BETrue[[reset: TRUE]] ]; loadStages23: PO.BoolExpr _ PO.Or[ BEFalse[[dPReject: TRUE]], BETrue[[reset: TRUE]] ]; Set[ s: stage2Failed, out: [stage3A: abort ] ]; Set[ s: stage2FailedOr1Hold, out: [stage2A: bubble ] ]; Set[ s: loadStage1, out: [loadStage1: TRUE ] ]; Set[ s: loadStages23, out: [loadStage2: TRUE ] ]; Set[ s: loadStages23, out: [loadStage3: TRUE ] ]}; GenPhAOutputs: PROC = { cur, temp: PO.BoolExpr; rschWaiting: PO.BoolExpr _ BETrue[[rschWaiting: TRUE]]; newRschWaiting: PO.BoolExpr _ PO.And[ BEFalse[[reset: TRUE]], BEFalse[[rschClear: TRUE]], PO.Or[ rschWaiting, BETrue[[reschedule: TRUE]] ] ]; notCondEffect1Bubble : PO.BoolExpr _ PO.Or[ BETrue[[reset: TRUE]], PO.Not[BE[m: [condEffect1: condEffectIsSig], d: [condEffect1: bubble]]] ]; stage1BHolding: PO.BoolExpr _ PO.And[ BEFalse[[reset: TRUE]], notCondEffect1Bubble, PO.Or[ BETrue[[stage1BHold: TRUE]], BETrue[[dPReject: TRUE]] ] ]; eUStkOverflow: PO.BoolExpr _ PO.And[ BETrue[[trapsEnabled2: TRUE]], BETrue[[eStkOverflow2: TRUE]] ]; ifuStkOverflow: PO.BoolExpr _ PO.And[ BETrue[[trapsEnabled2: TRUE]], BETrue[[iStkNearlyFull: TRUE]], PO.Or[ BETrue[[dPFaulting: TRUE]], PO.And[ BEFalse[[dPReject: TRUE]], PO.Or[ BETrue[[push2: TRUE]], BETrue[[eStkOverflow2: TRUE]], BETrue[[instFault2: TRUE]], PO.And[BETrue[[instStarting2: TRUE]], rschWaiting], PO.And[ BETrue[[eUCondition2: TRUE]], BE[ m: [condEffect2: condEffectIsSig], d: [condEffect2: macroTrap] ] ] ] ] ] ]; interlock: PO.BoolExpr _ PO.And[ PO.Or[ BETrue[[stage1BHold: TRUE]], BETrue[[dPReject: TRUE]] ], notCondEffect1Bubble ]; Set[ s: newRschWaiting, out:[ rschWaiting: TRUE ] ]; Set[ s: BETrue[[dPFaulting: TRUE]], out:[ stage3BCPipe: abort ] ]; Set[ s: stage1BHolding, out:[ stage1BHolding: TRUE, notBcLoadStage1: TRUE ] ]; Set[s: BETrue[[reset: TRUE]], out:[ stage2B: abort, microExcptJmp: resetting, except: [specialCode, reset] ] ]; cur _ BEFalse[[reset: TRUE]]; Set[s: PO.And[cur, BETrue[[protMicroCycle: TRUE]]], out:[ microExcptJmp: none, except: [specialCode, none] ] ]; cur _ PO.And[cur, BEFalse[[protMicroCycle: TRUE]]]; Set[s: PO.And[cur, ifuStkOverflow], out:[ stage2B: abort, microExcptJmp: trap, except: [specialCode, iStkOFlow] ] ]; cur _ PO.And[cur, PO.Not[ifuStkOverflow]]; Set[s: PO.And[cur, BETrue[[dPFaulting: TRUE]]], out:[ stage2B: abort, microExcptJmp: trap, except: [dpFault] ] ]; cur _ PO.And[cur, BEFalse[[dPFaulting: TRUE]]]; Set[s: PO.And[cur, BETrue[[dPReject: TRUE]], notCondEffect1Bubble], out: forceBubble ]; cur _ PO.And[cur, BEFalse[[dPReject: TRUE]]]; temp _ PO.And[cur, BETrue[[eUCondition2: TRUE]]]; Set[s:temp, m:[condEffect2: condEffectIsSig], d:[condEffect2: macroTrap], out:[ stage2B: abort, microExcptJmp: trap, except: [condCode] ] ]; Set[s:temp, m:[condEffect2: condEffectIsSig], d:[condEffect2: macroJump], out:[ stage2B: abort, microExcptJmp: cJump, except: [specialCode, cJump] ] ]; Set[s:temp, m:[condEffect2: condEffectIsSig], d:[condEffect2: microJump], out:[ microExcptJmp: microJump ] ]; cur _ PO.And[cur, BEFalse[[eUCondition2: TRUE]]]; Set[s: PO.And[cur, eUStkOverflow], out:[ stage2B: abort, microExcptJmp: trap, except: [specialCode, eStkOFlow] ] ]; cur _ PO.And[cur, PO.Not[eUStkOverflow]]; Set[s: PO.And[cur, interlock], out: forceBubble ]; cur _ PO.And[cur, PO.Not[interlock]]; cur _ PO.And[cur, BETrue[[instStarting2: TRUE]] ]; Set[s: PO.And[cur, BETrue[[trapsEnabled2: TRUE]], rschWaiting], out:[ rschClear: TRUE, stage2B: abort, microExcptJmp: trap, except: [specialCode, rschlWait] ]]; cur _ PO.And[cur, PO.Or[PO.Not[rschWaiting], BEFalse[[trapsEnabled2: TRUE]]]]; Set[s:cur, m:[instFault2: TRUE], d:[instFault2: TRUE], out:[ stage2B: abort, microExcptJmp: trap, except: [specialCode, ipFault] ]]; cur _ PO.And[cur, BEFalse[[instFault2: TRUE]]]; }; BE: PROC [m, d: MainPipeControlIn ] RETURNS[ PO.BoolExpr ] = { mRef: REF MainPipeControlIn _ NARROW[MainPipeControlPLA.mask]; dRef: REF MainPipeControlIn _ NARROW[MainPipeControlPLA.data]; mRef^ _ m; dRef^ _ d; RETURN[PO.GetBEForDataMask[MainPipeControlPLA]]}; BETrue: PROC [ d: MainPipeControlIn ] RETURNS[ PO.BoolExpr ] = { RETURN[ BE[d,d] ] }; BEFalse: PROC [ d: MainPipeControlIn ] RETURNS[ PO.BoolExpr ] = { RETURN[ BE[d,[]] ] }; Set: PROC [s: PO.BoolExpr _ NIL, m, d: MainPipeControlIn _ [ ], out: MainPipeControlOut] = { res: REF MainPipeControlOut _ NARROW[MainPipeControlPLA.out]; s _ IF s=NIL THEN BE[m,d] ELSE PO.And[s, BE[m,d] ]; res^ _ out; PO.SetOutForBE[MainPipeControlPLA, s]}; GenMainPipeControl: Commander.CommandProc = { filename: IO.ROPE _ PO.DefaultCMDLine[cmd.commandLine, defaultFile]; MainPipeControlPLA _ PO.NewPLA[ "IFUPLAMainPipeControl.MainPipeControlIn", "IFUPLAMainPipeControl.MainPipeControlOut"]; GenPhBOutputs[]; GenPhAOutputs[]; [ ] _ PO.ConvertTermListToCompleteSum[MainPipeControlPLA.termList, FALSE, FALSE, cmd.out]; [ ] _ PO.FindAMinimalCover[MainPipeControlPLA.termList, 120, cmd.out]; PO.WritePLAFile[filename, cmd.out, MainPipeControlPLA] }; ReadMainPipeControl: Commander.CommandProc = { MainPipeControlPLA _ PO.ReadPLAFile [ PO.DefaultCMDLine[ cmd.commandLine, defaultFile ], cmd.out ]}; doc: IO.ROPE = "Expects the name of the ttt file"; defaultFile: IO.ROPE = "IFUPLAMainPipeControl.ttt"; Commander.Register[key:"GenMainPipeControl", proc: GenMainPipeControl, doc: doc]; Commander.Register[key:"ReadMainPipeControl", proc: ReadMainPipeControl, doc: doc]; END. JIFUPLAMainPipeControlImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Last edited by McCreight, June 6, 1986 5:43:46 pm PDT Last edited by Curry, September 14, 1986 4:15:52 pm PDT Set[ s: BETrue[[x2ASrcLit1: TRUE]], out: [x2ASrcLit2: TRUE ] ]}; rschClear is generated below and fed back in the same phase A (since it would be expensive to invert its generating condition). It is just used to compute the newRschWaiting. stage1BHolding: PO.BoolExpr _ PO.Or[ BETrue[[reset: TRUE]], PO.And[ notCondEffect1Bubble, PO.Or[ BETrue[[stage1BHold: TRUE]], BETrue[[dPReject: TRUE]] ] ] ]; interlock: PO.BoolExpr _ PO.And[ PO.Or[ BETrue[[stage1BHold: TRUE]], PO.And[ BETrue[[stage1HoldIfReject: TRUE]], BETrue[[dPReject: TRUE]] ] ], notCondEffect1Bubble ]; Reset Intermediate cycle of protected microinstruction sequence IFU stack overflow Data PBus Fault, pipe stage 3 Reject ALU Condition, pipe stage 2 EU stack overflow, pipe stage 2 Pipe Interlock Reschedule Waiting, pipe stage 2 Instruction Fetch Fault, pipe stage 2 ELSE new unexceptional microinstruction [ ] Κ ž˜šœ™Jšœ<™Jšœœœ˜=Jšœœ3˜D—J˜Jšœœ˜0šœ"˜"Jšœ7˜7—J˜šž œœ˜šœœ ˜šœ˜Jšœœ˜šœ˜Jšœœ˜šœ˜Jšœœ˜Jšœœ˜—šœ˜Jšœœ˜Jšœœ ˜&————J˜šœœ œ˜"Jšœœ˜Jšœœ˜šœ˜Jšœœ˜JšœA˜C—Jšœ˜—J˜šœœ œ˜)Jšœ ˜ Jšœœ˜—J˜šœ œ œ˜ Jšœœœ˜?—šœœ ˜Jšœœœ˜=—J˜Jšœ3˜3Jšœ7˜7Jšœ)œ˜3Jšœ+œ˜5Jšœ+œ˜6J˜Jšœœœ™B—J˜šž œœ˜J˜Jšœ œ ˜J˜Jšœ―™―Jšœ œ!œ˜7šœœ œ˜%Jšœœ˜Jšœœ˜Jšœ&œ˜3—J˜šœœ ˜$šœ˜Jšœœ˜JšœœA˜J——J˜šœœ œ™$Jšœœ™šœ™Jšœ™Jšœœœ ™D——J˜šœœ œ˜%Jšœœ˜Jšœ˜Jšœœœ˜B—J˜šœœ œ˜%Jšœœ˜Jšœœ˜ —J˜šœœ œ˜&Jšœœ˜Jšœœ˜šœ˜Jšœœ˜šœ˜Jšœœ˜šœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜3šœ˜Jšœœ˜JšœM˜O————J˜—šœ œ œ™ šœ™Jšœœ™šœ™Jšœ#™#Jšœœ™——Jšœ™J™—šœ œ œ˜ šœ˜Jšœœ˜Jšœœ˜—Jšœ˜J˜—Jšœ+œ˜4J˜Jšœœ"˜BJ˜šœ˜Jšœœ˜Jšœœ˜—J™Jšœ™šœœ ˜#Jšœ˜Jšœ˜Jšœ#˜#—Jšœœ˜J˜Jšœ9™9šœœ"œ ˜9Jšœ˜Jšœ"˜"—Jšœœ#œ˜3J˜Jšœ™šœœ ˜)Jšœ˜Jšœ˜Jšœ'˜'—Jšœœ œ˜*J™Jšœ™šœœœ ˜5Jšœ˜Jšœ˜Jšœ˜—šœœœ˜/J˜—Jšœ™Jšœœœ.˜WJšœœœ˜-J˜Jšœ™Jšœœ œ˜1šœO˜OJšœ˜Jšœ˜Jšœ˜—šœO˜OJšœ˜Jšœ˜Jšœ#˜#—šœO˜OJšœ˜—Jšœœ!œ˜1J˜Jšœ™šœœ˜(Jšœ˜Jšœ˜Jšœ'˜'—Jšœœ œ˜)J˜Jšœ™Jšœœ)˜2Jšœœ œ˜%J˜šœœ!œ˜2J˜—Jšœ ™ šœœ!œ˜EJšœ œ˜Jšœ˜Jšœ˜Jšœ&˜&—Jš œœ œœ+œ˜NJ˜Jšœ%™%šœœœ˜Jšœœœ˜?Jšœœœ˜?Jšœœœ(˜G—J˜Jš žœœœœœœ ˜Uš žœœœœœœ ˜WJ˜—šžœœœ œ=˜\Jšœœœ˜=Jšœœœœœœœœ˜3Jšœ œ%˜3—J˜J˜šžœ˜-Jšœ œœœ.˜Dšœœ˜Jšœ*˜*Jšœ,˜,—Jšœ˜Jšœ˜Jšœœ;œœ ˜ZJšœœ>˜FJšœ7˜9—J˜šžœ˜.šœœ ˜#Jšœœ<˜@——J˜J˜Jšœœœ&˜4Jšœ œœ˜3JšœS˜SšœU˜UJ˜—Jšœ˜J™˜™J™———…—(κ