IFUCoreDrive:
CEDAR
DEFINITIONS =
BEGIN
CellProc:
PROC [
name: ROPE ← NIL,
data: Drive ←
NIL ]
RETURNS [cellType: Core.CellType]; -- driveCellClass
driveCellClass: Core.CellClass;
Drive: TYPE = REF DriveRec;
Drives: TYPE = LIST OF Drive;
DriveRec:
TYPE =
RECORD[
name: ROPE ← NIL, -- reference name
nameInv: ROPE ← NIL, -- reference name
cy: INT ← -1,
idx: INT ← -1,
drDir: Dir ← in,
gate: DrGate ← pos,
dualOut: BOOL ← FALSE,
inSh: ROPE ← NIL,
outSh: ROPE ← NIL,
inNm: ROPE ← NIL, -- if not this then inRelatiesignal
fire: ROPE ← NIL,
fireV: ROPE ← NIL,
nPreChg: ROPE ← NIL,
in: RelativeSignal ← [ ],
ref: RelativeSignal ← [pol: pos], -- ph is latch phase
out: RelativeSignal ← [ ],
pass: BOOL ← FALSE,
plaType: PLAType ← hot,
drRowType: RowType ← conn ];
RelativeSignal: TYPE = CoreName.RelativeSignal;
ROPE: TYPE = Core.ROPE;
Ph: TYPE = CoreName.Ph;
DrGate: TYPE = {neg, negAc, negBc, pos};
Dir: TYPE = {in, out};
Polarity: TYPE = CoreName.Polarity;
RowType: TYPE = {header, xheader, footer, xfooter, conn, dataUp, dataDn, blank, extend};
PLAType: TYPE = {precharged, hot};
PLAType: TYPE = {precharged, hot, decoder, static};
DrTileRec: TYPE = RECORD[nconn: DrTileNonConn, conn: DrTileConn];
DrTileNonConn: TYPE = ARRAY PLAType OF ARRAY RowType OF Core.CellType;
DrTileConn: TYPE = ARRAY Dir OF REF DrTileArray;
DrTileArray: TYPE = ARRAY DriveTileType OF Core.CellType;
DriveTileType: TYPE = {inPos, inNeg, inBlank, gndAB, latchA, latchB, gateP, gateN, gateNA, gateNB, latch, posSing, negSing, posDual, negDual};
DrNmType: TYPE = {in, nin, ref, nref, out, nout, inSh, ninSh, outSh, noutSh, unk};
DriveName: PROC[drive: Drive, type: DrNmType ← unk] RETURNS[ name: ROPE];
GetDriverTiles: PROC RETURNS[tiles: REF DrTileRec];
ConnectDrives: PROC [drives: Drives, inSh: ROPE ← NIL] RETURNS[outSh: ROPE];
ReverseDrives: PROC [drives: Drives] RETURNS[new: Drives];
DrivesToFrame: PROC [name: ROPE, drives: Drives] RETURNS[cell: Core.CellType];
CapDrives:
PROC [drives: Drives, sIn, altOut:
ROPE ←
NIL]
RETURNS[newDrives: Drives, sOut: ROPE ← NIL];
SpecificDrive:
PROC[ dir: Dir, in:
ROPE, out:
ROPE, inverted, dual:
BOOL ← FALSE ]
RETURNS[dr: IFUCoreDrive.Drive];
AdjustDriveOutPh: PROC [ drives: Drives, names: ROPE];
AdjustDriveInPhRef: PROC [inLatchPh: Ph, drives: Drives, names: ROPE];
FindDrive: PROC [drives: Drives, name: ROPE] RETURNS[drive: Drive];
RefToDrives: PROC [refRec: REF, initial: DriveRec] RETURNS[drives: Drives];
RefToDriverFrame:
PROC[name:
ROPE, refRec:
REF, initial: DriveRec]
RETURNS[cell: Core.CellType, outSh: ROPE];
SetDShiftIO: PROC[cellType: Core.CellType, sIn, sOut: ROPE];
GetDShiftIO: PROC[cellType: Core.CellType] RETURNS [sIn, sOut: ROPE];
END.