<> <> <> <> <> DIRECTORY RoseTypes, IFUInstrDecode, RoseCreate, Dragon, DragOpsCross, IFUPLAInstrDecode, SwitchTypes; IFUInstrDecodeImpl: CEDAR PROGRAM IMPORTS RoseCreate, IFUPLAInstrDecode EXPORTS IFUInstrDecode = BEGIN OPEN RoseTypes, IFUInstrDecode; <> MicroCycleNext: TYPE = IFUPLAInstrDecode.MicroCycleNext; PCNext: TYPE = IFUPLAInstrDecode.PCNext; PCBusSrc: TYPE = IFUPLAInstrDecode.PCBusSrc; PCPipeSrc: TYPE = IFUPLAInstrDecode.PCPipeSrc; ABCSourceLt: TYPE = IFUPLAInstrDecode.ABCSourceLt; ABCSourceRt: TYPE = IFUPLAInstrDecode.ABCSourceRt; PlusOffset: TYPE = IFUPLAInstrDecode.PlusOffset; MinusOffset: TYPE = IFUPLAInstrDecode.MinusOffset; LSourceLt: TYPE = IFUPLAInstrDecode.LSourceLt; LSourceRt: TYPE = IFUPLAInstrDecode.LSourceRt; SSourceLt: TYPE = IFUPLAInstrDecode.SSourceLt; SSourceRt: TYPE = IFUPLAInstrDecode.SSourceRt; X2ALitSource: TYPE = IFUPLAInstrDecode.X2ALitSource; ALUOps: TYPE = Dragon.ALUOps; CondSelects: TYPE = Dragon.CondSelects; CondEffect: TYPE = IFUPLAInstrDecode.CondEffect; PBusCommands: TYPE = Dragon.PBusCommands; RegisterCells: PROC = BEGIN InstrDecode _ RoseCreate.RegisterCellType[name: "InstrDecode", expandProc: NIL, ioCreator: CreateInstrDecodeIO, driveCreator: CreateInstrDecodeDrive, initializer: InitializeInstrDecode, evals: [EvalSimple: InstrDecodeEvalSimple], tests: LIST[], ports: CreateInstrDecodePorts[] ]; END; otherss: SymbolTable _ RoseCreate.GetOtherss["IFUInstrDecode.partsAssertions"]; InstrDecode: PUBLIC CellType; CreateInstrDecodePorts: PROC RETURNS [ports: Ports] = {ports _ RoseCreate.PortsFromFile["IFUInstrDecode.InstrDecode.rosePorts"]}; InstrDecodeSwitchIORef: TYPE = REF InstrDecodeSwitchIORec; InstrDecodeSwitchIORec: TYPE = RECORD [ MicroCycleAB: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,InstReadyAB: SwitchTypes.SwitchVal ,OpAB: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,AlphaAB: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,BetaAB: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,PushPendingAB: SwitchTypes.SwitchVal ,PopPendingAB: SwitchTypes.SwitchVal ,UserMode0AB: SwitchTypes.SwitchVal ,GetNextInstBA: SwitchTypes.SwitchVal ,MacroJumpBA: SwitchTypes.SwitchVal ,InstStarting0BA: SwitchTypes.SwitchVal ,MicroCycleNextBA: PACKED ARRAY [0 .. 3) OF SwitchTypes.SwitchVal ,PCNextBA: PACKED ARRAY [0 .. 1) OF SwitchTypes.SwitchVal ,PCBusSrcB: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,PCPipeSrcBA: PACKED ARRAY [0 .. 3) OF SwitchTypes.SwitchVal ,Push0BA: SwitchTypes.SwitchVal ,Pop0BA: SwitchTypes.SwitchVal ,X1ASrcStackBA: SwitchTypes.SwitchVal ,X1ADstStackBA: SwitchTypes.SwitchVal ,XBusStackEldestBA: SwitchTypes.SwitchVal ,XBusStackLBA: SwitchTypes.SwitchVal ,X1ASrcSLimitAc: SwitchTypes.SwitchVal ,X1ADstSLimitAc: SwitchTypes.SwitchVal ,X2ASrcStatusBA: SwitchTypes.SwitchVal ,X1ADstStatusBA: SwitchTypes.SwitchVal ,ASourceLtBA: PACKED ARRAY [0 .. 5) OF SwitchTypes.SwitchVal ,ASourceRtBA: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,ASourceOffBA: PACKED ARRAY [0 .. 3) OF SwitchTypes.SwitchVal ,BSourceLtBA: PACKED ARRAY [0 .. 5) OF SwitchTypes.SwitchVal ,BSourceRtBA: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,BSourceOffBA: PACKED ARRAY [0 .. 3) OF SwitchTypes.SwitchVal ,CSourceLtBA: PACKED ARRAY [0 .. 5) OF SwitchTypes.SwitchVal ,CSourceRtBA: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,CSourceOffBA: PACKED ARRAY [0 .. 3) OF SwitchTypes.SwitchVal ,C0IsFieldCtlBA: SwitchTypes.SwitchVal ,LSourceLtBA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,LSourceRtBA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,SSourceLtBA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,SSourceRtBA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,PopSa0BA: SwitchTypes.SwitchVal ,PopSb0BA: SwitchTypes.SwitchVal ,PushSc0BA: SwitchTypes.SwitchVal ,X2ALitSourceBA: PACKED ARRAY [0 .. 5) OF SwitchTypes.SwitchVal ,KIsRtOp0BA: SwitchTypes.SwitchVal ,FCtlIsRtOp0BA: SwitchTypes.SwitchVal ,EUAluOp0BA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,EUCondSel0BA: PACKED ARRAY [0 .. 4) OF SwitchTypes.SwitchVal ,EUCondEffect0BA: PACKED ARRAY [0 .. 2) OF SwitchTypes.SwitchVal ,DPCmnd0BA: PACKED ARRAY [0 .. 8) OF SwitchTypes.SwitchVal ,DPCmndRd0BA: SwitchTypes.SwitchVal ,ClearTrapsEnbledBA: SwitchTypes.SwitchVal ,ClearUserModeBA: SwitchTypes.SwitchVal ,KPadsIn0BA: SwitchTypes.SwitchVal ,X2ASrcLit0BA: SwitchTypes.SwitchVal ,PhA: SwitchTypes.SwitchVal ,PhB: SwitchTypes.SwitchVal ]; InstrDecodeSimpleIORef: TYPE = REF InstrDecodeSimpleIORec; InstrDecodeSimpleIORec: TYPE = RECORD [ fill0: [0 .. 255], MicroCycleAB: [0..255] ,fill1: [0 .. 32767], InstReadyAB: BOOLEAN ,fill2: [0 .. 255], OpAB: [0..255] ,fill3: [0 .. 255], AlphaAB: [0..255] ,fill4: [0 .. 255], BetaAB: [0..255] ,fill5: [0 .. 32767], PushPendingAB: BOOLEAN ,fill6: [0 .. 32767], PopPendingAB: BOOLEAN ,fill7: [0 .. 32767], UserMode0AB: BOOLEAN ,fill8: [0 .. 32767], GetNextInstBA: BOOLEAN ,fill9: [0 .. 32767], MacroJumpBA: BOOLEAN ,fill10: [0 .. 32767], InstStarting0BA: BOOLEAN ,fill11: [0 .. 8191], MicroCycleNextBA: MicroCycleNext ,fill12: [0 .. 32767], PCNextBA: PCNext ,fill13: [0 .. 255], PCBusSrcB: PCBusSrc ,fill14: [0 .. 8191], PCPipeSrcBA: PCPipeSrc ,fill15: [0 .. 32767], Push0BA: BOOLEAN ,fill16: [0 .. 32767], Pop0BA: BOOLEAN ,fill17: [0 .. 32767], X1ASrcStackBA: BOOLEAN ,fill18: [0 .. 32767], X1ADstStackBA: BOOLEAN ,fill19: [0 .. 32767], XBusStackEldestBA: BOOLEAN ,fill20: [0 .. 32767], XBusStackLBA: BOOLEAN ,fill21: [0 .. 32767], X1ASrcSLimitAc: BOOLEAN ,fill22: [0 .. 32767], X1ADstSLimitAc: BOOLEAN ,fill23: [0 .. 32767], X2ASrcStatusBA: BOOLEAN ,fill24: [0 .. 32767], X1ADstStatusBA: BOOLEAN ,fill25: [0 .. 2047], ASourceLtBA: ABCSourceLt ,fill26: [0 .. 255], ASourceRtBA: ABCSourceRt ,fill27: [0 .. 8191], ASourceOffBA: PlusOffset ,fill28: [0 .. 2047], BSourceLtBA: ABCSourceLt ,fill29: [0 .. 255], BSourceRtBA: ABCSourceRt ,fill30: [0 .. 8191], BSourceOffBA: PlusOffset ,fill31: [0 .. 2047], CSourceLtBA: ABCSourceLt ,fill32: [0 .. 255], CSourceRtBA: ABCSourceRt ,fill33: [0 .. 8191], CSourceOffBA: MinusOffset ,fill34: [0 .. 32767], C0IsFieldCtlBA: BOOLEAN ,fill35: [0 .. 4095], LSourceLtBA: LSourceLt ,fill36: [0 .. 4095], LSourceRtBA: LSourceRt ,fill37: [0 .. 4095], SSourceLtBA: SSourceLt ,fill38: [0 .. 4095], SSourceRtBA: SSourceRt ,fill39: [0 .. 32767], PopSa0BA: BOOLEAN ,fill40: [0 .. 32767], PopSb0BA: BOOLEAN ,fill41: [0 .. 32767], PushSc0BA: BOOLEAN ,fill42: [0 .. 2047], X2ALitSourceBA: X2ALitSource ,fill43: [0 .. 32767], KIsRtOp0BA: BOOLEAN ,fill44: [0 .. 32767], FCtlIsRtOp0BA: BOOLEAN ,fill45: [0 .. 4095], EUAluOp0BA: ALUOps ,fill46: [0 .. 4095], EUCondSel0BA: CondSelects ,fill47: [0 .. 16383], EUCondEffect0BA: CondEffect ,fill48: [0 .. 255], DPCmnd0BA: PBusCommands ,fill49: [0 .. 32767], DPCmndRd0BA: BOOLEAN ,fill50: [0 .. 32767], ClearTrapsEnbledBA: BOOLEAN ,fill51: [0 .. 32767], ClearUserModeBA: BOOLEAN ,fill52: [0 .. 32767], KPadsIn0BA: BOOLEAN ,fill53: [0 .. 32767], X2ASrcLit0BA: BOOLEAN ,fill54: [0 .. 32767], PhA: BOOLEAN ,fill55: [0 .. 32767], PhB: BOOLEAN ]; InstrDecodeDriveRef: TYPE = REF InstrDecodeDriveRec; InstrDecodeDriveRec: TYPE = RECORD [driveRecordInitialPadding: DriveTagType, drive: PACKED ARRAY InstrDecodePort OF DriveLevel]; InstrDecodePort: TYPE = { MicroCycleAB, InstReadyAB, OpAB, AlphaAB, BetaAB, PushPendingAB, PopPendingAB, UserMode0AB, GetNextInstBA, MacroJumpBA, InstStarting0BA, MicroCycleNextBA, PCNextBA, PCBusSrcB, PCPipeSrcBA, Push0BA, Pop0BA, X1ASrcStackBA, X1ADstStackBA, XBusStackEldestBA, XBusStackLBA, X1ASrcSLimitAc, X1ADstSLimitAc, X2ASrcStatusBA, X1ADstStatusBA, ASourceLtBA, ASourceRtBA, ASourceOffBA, BSourceLtBA, BSourceRtBA, BSourceOffBA, CSourceLtBA, CSourceRtBA, CSourceOffBA, C0IsFieldCtlBA, LSourceLtBA, LSourceRtBA, SSourceLtBA, SSourceRtBA, PopSa0BA, PopSb0BA, PushSc0BA, X2ALitSourceBA, KIsRtOp0BA, FCtlIsRtOp0BA, EUAluOp0BA, EUCondSel0BA, EUCondEffect0BA, DPCmnd0BA, DPCmndRd0BA, ClearTrapsEnbledBA, ClearUserModeBA, KPadsIn0BA, X2ASrcLit0BA, PhA, PhB}; CreateInstrDecodeIO: PROC [ct: CellType, switch: BOOL] RETURNS [ioAsAny: REF ANY] --IOCreator-- = { ioAsAny _ IF switch THEN NEW[InstrDecodeSwitchIORec] ELSE NEW[InstrDecodeSimpleIORec]; }; CreateInstrDecodeDrive: PROC [ct: CellType] RETURNS [driveAsAny: REF ANY] --DriveCreator-- = { driveAsAny _ NEW[InstrDecodeDriveRec]; }; InstrDecodeStateRef: TYPE = REF InstrDecodeStateRec; InstrDecodeStateRec: TYPE = RECORD [ nextMacroBA: IFUPLAInstrDecode.NextMacro, preEUAluOp0BA: Dragon.ALUOps, aluOpIs47BA: BOOL, preEUCondSel0BA: Dragon.CondSelects, condSelIsOp57BA: BOOL, preDPCmnd0BA: Dragon.PBusCommands, preDPCmndSel0BA: IFUPLAInstrDecode.DPCmndSel, x1ASrcSLimitBA: BOOL, x1ADstSLimitBA: BOOL, phALast: BOOL ]; InitializeInstrDecode: Initializer = { state: InstrDecodeStateRef _ NEW[InstrDecodeStateRec]; cell.realCellStuff.state _ state; }; InstrDecodeEvalSimple: SimpleEval = BEGIN drive: InstrDecodeDriveRef _ NARROW[cell.realCellStuff.newDriveAsAny]; sw: InstrDecodeSwitchIORef _ NARROW[cell.realCellStuff.switchIO]; newIO: InstrDecodeSimpleIORef _ NARROW[cell.realCellStuff.newIO]; state: InstrDecodeStateRef _ NARROW[cell.realCellStuff.state]; BEGIN OPEN drive, newIO, state; IF PhA THEN { PCBusSrcB _ offSetPC; -- precharge phALast _ TRUE}; IF PhB AND phALast THEN { [ [ nextMacro: nextMacroBA, macroJump: MacroJumpBA, microCycleNext: MicroCycleNextBA, pcNext: PCNextBA, pcBusSrc: PCBusSrcB, pcPipeSrc: PCPipeSrcBA, kPadsIn: KPadsIn0BA, push: Push0BA, pop: Pop0BA, x1ASrcSLimit: x1ASrcSLimitBA, x2ASrcStatus: X2ASrcStatusBA, x1ASrcStack: X1ASrcStackBA, x1ADstSLimit: x1ADstSLimitBA, x1ADstStatus: X1ADstStatusBA, x1ADstStack: X1ADstStackBA, xBusStackEldest: XBusStackEldestBA, xBusStackL: XBusStackLBA, aReg: [ASourceLtBA, ASourceRtBA, ASourceOffBA], bReg: [BSourceLtBA, BSourceRtBA, BSourceOffBA], cReg: [CSourceLtBA, CSourceRtBA, CSourceOffBA], cRegIsField: C0IsFieldCtlBA, lSource: [LSourceLtBA, LSourceRtBA], sSource: [SSourceLtBA, SSourceRtBA], popSa: PopSa0BA, popSb: PopSb0BA, pushSc: PushSc0BA, x2ALitSource: X2ALitSourceBA, kIsRtOp: KIsRtOp0BA, fCtlIsRtOp: FCtlIsRtOp0BA, aluOp: preEUAluOp0BA, aluOpIsOp47: aluOpIs47BA, condSel: preEUCondSel0BA, condSelIsOp57: condSelIsOp57BA, condEffect: EUCondEffect0BA, dpCmnd: preDPCmnd0BA, dpCmndIsRd: DPCmndRd0BA, dpCmndSel: preDPCmndSel0BA, clearTrapsEnbled: ClearTrapsEnbledBA, clearUserMode: ClearUserModeBA ] ] _ IFUPLAInstrDecode.InstrDecodeProc[ [ state: MicroCycleAB, instReady: InstReadyAB, op: DragOpsCross.Inst[VAL[OpAB]], alpha: AlphaAB, beta: BetaAB, pushPending: PushPendingAB, popPending: PopPendingAB, userMode: UserMode0AB ] ]; DPCmnd0BA _ SELECT preDPCmndSel0BA FROM beta => LOOPHOLE[BetaAB], ENDCASE => preDPCmnd0BA; EUAluOp0BA _ IF aluOpIs47BA THEN LOOPHOLE[OpAB MOD 16] ELSE preEUAluOp0BA; EUCondSel0BA _ IF condSelIsOp57BA THEN LOOPHOLE[OpAB MOD 8] ELSE preEUCondSel0BA; X2ASrcLit0BA _ X2ALitSourceBA # none; GetNextInstBA _ nextMacroBA=get; InstStarting0BA _ MicroCycleAB=0; phALast _ FALSE; }; X1ASrcSLimitAc _ PhA AND x1ASrcSLimitBA; X1ADstSLimitAc _ PhA AND x1ADstSLimitBA; END; END; RegisterCells[]; END.