DIRECTORY Basics, BitOps, Core, CoreClasses, CoreCreate, CoreProperties, Ports, Rosemary, RosemaryUser, TamPorts, TamEu, Rope, TamDefs, TamPc; PcCells: CEDAR PROGRAM IMPORTS Ports, Rosemary, TamPorts, TamEu, TamPc, Basics = BEGIN OPEN TamDefs, TamPorts; BoolToInt: PROC [b: BOOL] RETURNS [NAT] = {RETURN[IF b THEN 1 ELSE 0]}; busBits: NAT _ 32; PcState: TYPE = REF PcStateRec; PcStateRec: TYPE = RECORD [d1, d2, r, xBus, topCxt, nextRegCxt, pcRaddrSel, pcWaddrSel, opLength, opLength0, clock, pcNext, vdd, gnd: NAT _ LAST[NAT]]; PcInit: Rosemary.InitProc = { state: PcState _ NEW[PcStateRec]; [] _ Ports.InitPorts[cellType, ls, none, "D1", "D2", "EUControl", "nEUControl"]; [] _ Ports.InitPorts[cellType, ls, drive, "R"]; [] _ Rosemary.SetFixedWire[cellType.public[state.vdd], H]; [] _ Rosemary.SetFixedWire[cellType.public[state.gnd], L]; stateAny _ state; }; PcEvalSimple: Rosemary.EvalProc = { state: PcState _ NARROW[stateAny]; }; IBufState: TYPE = REF IBufStateRec; IBufStateRec: TYPE = RECORD [d1, d2, xBus, pcNext, ibWaddr, wtIbuf, stopIBWt, opLength, opLength0, selIBufData, clock, r, ibufN, opCode, vdd, gnd: NAT _ LAST[NAT], iBufArray: ARRAY [0..7] OF CARD, valid: ARRAY[0..7] OF BOOL, lastClock: BOOL ]; IBufInit: Rosemary.InitProc = { state: IBufState _ NEW[IBufStateRec]; [] _ Ports.InitPorts[cellType, l, none, "Vdd", "Gnd"]; [] _ Ports.InitPorts[cellType, ls, none, "D1", "D2", "XBus", "PCNext", "IbWaddr", "WtIbuf", "StopIbWt", "OpLength", "OpLength0", "SelIBufData", "Clock"]; [] _ Ports.InitPorts[cellType, ls, drive, "R", "IbufN", "OpCode"]; [state.vdd, state.gnd] _ Ports.PortIndexes[cellType.public, "Vdd", "Gnd"]; [state.d1, state.d2, state.xBus, state.pcNext, state.ibWaddr, state.wtIbuf, state.stopIBWt, state.opLength, state.opLength0, state.selIBufData, state.clock] _ Ports.PortIndexes[cellType.public, "D1", "D2", "XBus", "PCNext", "IbWaddr", "WtIbuf", "StopIbWt", "OpLength", "OpLength0", "SelIBufData", "Clock"]; [state.r, state.ibufN, state.opCode] _ Ports.PortIndexes[cellType.public, "R", "IbufN", "OpCode"]; state.valid _ [FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE]; state.iBufArray _ [0, 0, 0, 0, 0, 0, 0, 0]; state.lastClock _ FALSE; [] _ Rosemary.SetFixedWire[cellType.public[state.vdd], H]; [] _ Rosemary.SetFixedWire[cellType.public[state.gnd], L]; stateAny _ state; }; IBufEvalSimple: Rosemary.EvalProc = { overFlow, carry, gt: BOOL _ FALSE; state: IBufState _ NARROW[stateAny]; }; InstDPState: TYPE = REF InstDPStateRec; InstDPStateRec: TYPE = RECORD [d1, r, load, nByteSel, selIBufData, shiftSel, selCur, selNext, selWrite, nWtIBuf, clock, ibufN, opCode, xBus, vdd, gnd: NAT _ LAST[NAT], iBufArray: ARRAY [0..7] OF CARD, valid: ARRAY[0..7] OF BOOL, lastClock: BOOL ]; InstDPInit: Rosemary.InitProc = { state: InstDPState _ NEW[InstDPStateRec]; [] _ Ports.InitPorts[cellType, l, none, "Vdd", "Gnd"]; [] _ Ports.InitPorts[cellType, ls, none, "R", "load", "nByteSel", "SelIBufData", "ShiftSel", "SelCur", "SelNext", "SelWrite", "nWtIBuf", "CK", "XBus"]; [] _ Ports.InitPorts[cellType, ls, drive, "D1", "IbufN", "OpCode"]; [state.vdd, state.gnd] _ Ports.PortIndexes[cellType.public, "Vdd", "Gnd"]; [state.r, state.load, state.nByteSel, state.selIBufData, state.shiftSel, state.selCur, state.selNext, state.selWrite, state.nWtIBuf, state.clock, state.xBus] _ Ports.PortIndexes[cellType.public, "R", "load", "nByteSel", "SelIBufData", "ShiftSel", "SelCur", "SelNext", "SelWrite", "nWtIBuf", "CK", "XBus"]; [state.d1, state.ibufN, state.opCode] _ Ports.PortIndexes[cellType.public, "D1", "IbufN", "OpCode"]; state.valid _ [FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE]; state.iBufArray _ [0, 0, 0, 0, 0, 0, 0, 0]; state.lastClock _ FALSE; [] _ Rosemary.SetFixedWire[cellType.public[state.vdd], H]; [] _ Rosemary.SetFixedWire[cellType.public[state.gnd], L]; stateAny _ state; }; InstDPEvalSimple: Rosemary.EvalProc = { ibl, nibl, curIWd, nextIWd, iBSres, D1: TamDefs.Word _ ZerosWord; ibufN, opCode, selIBufData: NAT _ 0; state: InstDPState _ NARROW[stateAny]; xS: BOOL _ HasXs[p, state.selCur] OR HasXs[p, state.selNext] OR HasXs[p, state.selWrite]; ClrP[p, state.ibufN]; ClrP[p, state.opCode]; IF NOT xS THEN { IF NOT (HasXs[p, state.xBus] OR HasXs[p, state.nWtIBuf] OR HasXs[p, state.clock]) THEN [ibl, nibl] _ TamPc.IBufDrive[ PortToTamWord[p, state.xBus], PortToNat[p, state.nWtIBuf], PortToNat[p, state.clock]]; IF NOT (HasXs[p, state.selCur] OR HasXs[p, state.selNext] OR HasXs[p, state.selWrite]) THEN [curIWd, nextIWd] _ TamPc.IBufReg[ibl, nibl, PortToNat[p, state.selCur], PortToNat[p, state.selNext], PortToNat[p, state.selWrite]]; IF NOT TamPorts.HasXs[p, state.shiftSel] THEN [iBSres, ibufN, opCode] _ TamPc.IShifter[curIWd, nextIWd, PortToNat[p, state.shiftSel]]; SetP[p, state.opCode, opCode]; SetP[p, state.ibufN, ibufN]; IF NOT (HasXs[p, state.selIBufData] OR HasXs[p, state.nByteSel] OR HasXs[p, state.load] OR HasXs[p, state.clock]) THEN D1 _ TamPc.IBufDataRegs[iBSres, selIBufData _ PortToNat[p, state.selIBufData], Basics.BITXOR[PortToNat[p, state.nByteSel], 0FH], PortToNat[p, state.load], PortToNat[p, state.clock]]; }; IF selIBufData = 1 THEN SetPWord[p, state.d1, D1] ELSE ClrP[p, state.d1]; }; IBuf6TCellState: TYPE = REF IBuf6TCellStateRec; IBuf6TCellStateRec: TYPE = RECORD [in, nIn, selWrite, out, vdd, gnd: NAT _ LAST[NAT], storedval: NAT]; IBuf6TCellInit: Rosemary.InitProc = { state: IBuf6TCellState _ NEW[IBuf6TCellStateRec]; [] _ Ports.InitPorts[cellType, l, none, "Vdd", "Gnd"]; [] _ Ports.InitPorts[cellType, ls, none, "In", "nIn", "SelWrite"]; [] _ Ports.InitPorts[cellType, ls, drive, "Out",]; [state.vdd, state.gnd] _ Ports.PortIndexes[cellType.public, "Vdd", "Gnd"]; [state.in, state.nIn, state.selWrite, state.out] _ Ports.PortIndexes[cellType.public, "In", "nIn", "SelWrite", "Out"]; state.storedval _ 0; [] _ Rosemary.SetFixedWire[cellType.public[state.vdd], H]; [] _ Rosemary.SetFixedWire[cellType.public[state.gnd], L]; stateAny _ state; }; IBuf6TCellEvalSimple: Rosemary.EvalProc = { state: IBuf6TCellState _ NARROW[stateAny]; xS: BOOL _ HasXs[p, state.in] OR HasXs[p, state.nIn] OR HasXs[p, state.selWrite]; IF NOT xS THEN IF PortToNat[p, state.selWrite] = 1 THEN { in: NAT _ PortToNat[p, state.in]; nIn: NAT _ PortToNat[p, state.nIn]; IF (in + nIn) = 1 THEN state.storedval _ in; }; SetP[p, state.out, state.storedval]; p[state.out].d _ drive; stateAny _ state; }; iBuf6TCellName: Rope.ROPE = Rosemary.Register[roseClassName: "IBuf6TCell", init: IBuf6TCellInit, evalSimple: IBuf6TCellEvalSimple]; instDPName: Rope.ROPE = Rosemary.Register[roseClassName: "InstDP", init: InstDPInit, evalSimple: InstDPEvalSimple]; iBufLogicName: Rope.ROPE = Rosemary.Register[roseClassName: "IBufLogic", init: IBufInit, evalSimple: IBufEvalSimple]; PcName: Rope.ROPE = Rosemary.Register[roseClassName: "PcLogic", init: PcInit, evalSimple: PcEvalSimple]; END. μPcCells.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. April 13, 1987 4:34:45 pm PST Last Edited by: Krivacic April 6, 1987 4:08:37 pm PDT -------------------- PcLogic --------------------- --PROC [cellType: Core.CellType, p: Ports.Port] RETURNS [stateAny: REF ANY _ NIL]-- [state.d1, state.d2, state.r, state.euControl, state.nEuControl, state.vdd, state.gnd] _ Ports.PortIndexes[cellType.public, "D1", "D2", "R", "EUControl", "nEUControl", "Vdd", "Gnd"]; -- PROC [p: Ports.Port, stateAny: REF ANY]-- hasXs: BOOL _ TamPorts.HasXs[p, state.euControl] OR TamPorts.HasXs[p, state.d1] OR TamPorts.HasXs[p, state.d2]; IF (NOT hasXs) AND (LOOPHOLE[EUSelect[p, state.euControl], EuUnits] = LU) THEN TamPorts.SetP[ p, state.r, TamDefs.WordToCard[ TamEu.LogicalUnit[ EUMask[p, state.euControl], TamPorts.PortToTamWord[p, state.d1], TamPorts.PortToTamWord[p, state.d2]]]] ELSE TamPorts.ClrP[p, state.r]; -------------------- IBufLogic --------------------- --PROC [cellType: Core.CellType, p: Ports.Port] RETURNS [stateAny: REF ANY _ NIL]-- PROC [p: Ports.Port, stateAny: REF ANY]-- hasXs: BOOL _ TamPorts.HasXs[p, state.opCode] OR TamPorts.HasXs[p, state.pcNext] OR TamPorts.HasXs[p, state.ibWaddr] OR TamPorts.HasXs[p, state.wtIbuf] OR TamPorts.HasXs[p, state.opLength] OR TamPorts.HasXs[p, state.selIBufData] OR TamPorts.HasXs[p, state.d1] OR TamPorts.HasXs[p, state.d2]; -------------------- InstDP --------------------- --PROC [cellType: Core.CellType, p: Ports.Port] RETURNS [stateAny: REF ANY _ NIL]-- PROC [p: Ports.Port, stateAny: REF ANY]-- -------------------- IBuf6TCell --------------------- --PROC [cellType: Core.CellType, p: Ports.Port] RETURNS [stateAny: REF ANY _ NIL]-- PROC [p: Ports.Port, stateAny: REF ANY]-- Κ˜JšœšΟkΟr™žJ™J™Jš ˜ Icodešœ„˜„J˜šœ œ˜Jšœ0˜7J˜Jšœœœ˜ J˜JšΟn œœœœœœœœœ˜GJ˜Jšœ œ˜J˜J˜JšΟcœ  œ™2J˜Jšœ œœ ˜Kš œ œœmœœœ˜—K˜šŸœ˜K™Kš S™SK˜Kšœœ ˜!K˜KšœP˜PKšœ/˜/K˜KšœΆ™ΆK˜Kšœ:˜:Kšœ:˜:Kšœ˜Kšœ˜K˜—šŸ œ˜$J™Jšœœœ ™-J˜Jšœœ ˜"J˜Jšœœ&œœ™oJ˜š œœœœ*œœ™Qšœ™Jšœ™Jšœ ™ šœ™šœ™Jšœ™Jšœ%™%Jšœ&™&——J™—Jšœ™—J˜Jšœ˜—J˜Jš œ  œ™4J˜Jšœ œœ˜#Kšœœœxœœœœœœ œœœ œ˜τK˜šŸœ˜K™Kš S™SK˜Kšœœ˜%K˜Kšœ6˜6Kšœ™˜™KšœB˜BK˜KšœJ˜JKšœ²˜²Kšœb˜bK˜Kšœœœœœœœœœ˜GKšœ+˜+Kšœœ˜K˜Kšœ:˜:Kšœ:˜:Kšœ˜Kšœ˜K˜—J˜šŸœ˜%J˜Jšœœœ ™*J˜Jšœœœ˜"Jšœœ ˜$J˜Jšœœ#œ œ"œ œ!œ%œœ™¨˜J˜—Jšœ˜—J˜J˜J˜Jš œ œ™1J˜Jšœ œœ˜'Kšœœœ{œœœœœœ œœœ œ˜ωK˜šŸ œ˜!K™Kš S™SK˜Kšœœ˜)K˜Kšœ6˜6Kšœ—˜—KšœC˜CK˜KšœJ˜JKšœ±˜±Kšœd˜dK˜Kšœœœœœœœœœ˜GKšœ+˜+Kšœœ˜K˜Kšœ:˜:Kšœ:˜:Kšœ˜Kšœ˜K˜—J˜šŸœ˜'J˜Jšœœœ ™*J˜Jšœ$Ÿœ˜AJšœœ˜$Jšœœ ˜&J˜Jšœœœœ˜[J˜J˜J˜J˜šœœœ˜J˜š œœœœ˜Všœ˜šœ˜Jšœ˜Jšœ˜Jšœ˜———J˜J˜š œœœœ˜[šœ˜šœ˜Jšœ˜Jšœ˜Jšœ˜J˜——J˜—šœœ"˜-šœ˜šœ ˜ Jšœ˜———J˜J˜J˜š œœœœœ˜všœ˜šœJ˜JJšœœΟfœ˜2Jšœ˜Jšœ˜———J˜Jšœ˜J˜J˜—Jšœœœ˜IJ˜Jšœ˜—J˜Jš œ  œ™5J˜Jšœœœ˜/Kš œœœ$œœœœ˜fK˜šŸœ˜%K™Kš S™SK˜Kšœœ˜1K˜Kšœ6˜6KšœB˜BKšœ2˜2K˜KšœJ˜JKšœv˜vK˜K˜K˜Kšœ:˜:Kšœ:˜:Kšœ˜Kšœ˜K˜—J˜šŸœ˜+J˜Jšœœœ ™*J˜Jšœœ ˜*Jšœœœœ˜SJ˜šœœœ˜šœ#œ˜+Jšœœ˜!Jšœœ˜#Jšœœ˜,J˜J˜——J˜$J˜Jšœ˜Jšœ˜—J˜Jšœœj˜ƒJ˜J˜Jšœœ^˜sJ˜J˜Jšœœ]˜uJ˜Jšœ œW˜hJ˜J˜J˜J˜Jšœ˜—J™—…—,*