<> <> <> DIRECTORY CD, CDCells, CMos, CDPinObjects, EuControl, EuGen, EUtils, PW, PWCmos, PWDescr, PWPins, Rope; EuGenImplA: CEDAR PROGRAM IMPORTS CMos, CDCells, EuControl, EUtils, PW, PWCmos, PWDescr, PWPins, Rope EXPORTS EuGen = BEGIN OPEN EuGen; <<-- Control descriptors>> regscdpd: PWDescr.Descriptor; regscdpu: PWDescr.Descriptor; regsInitialised: BOOL _ FALSE; <<>> EmptyDescrRamPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["PhA", "PhB", "nhold2BA", "nrejectBA", "DExecute", "DStateAddress", "aAdrHi", "aAdrLow", "bAdrHi", "bAdrLow", "cAdrHi", "cAdrLow", "spare4w", "spare1b"]]; PWDescr.SetTypeBit[descr, "PhA"]; PWDescr.SetTypeBit[descr, "PhB"]; PWDescr.SetTypeBit[descr, "nhold2BA"]; PWDescr.SetTypeBit[descr, "nrejectBA"]; PWDescr.SetTypeBit[descr, "DExecute"]; PWDescr.SetTypeInt[descr, "DStateAddress", 4]; PWDescr.SetTypeInt[descr, "aAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "aAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "bAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "bAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "cAdrHi", nbBitInRowDecoder]; PWDescr.SetTypeInt[descr, "cAdrLow", nbBitInColumnDecoder]; PWDescr.SetTypeInt[descr, "spare4w", 4]; PWDescr.SetTypeBit[descr, "spare1b"]; END; InitDescrRamPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ EmptyDescrRamPD[]; PWDescr.SetBit[descr, "PhA", TRUE]; END; EmptyDescrRamPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["nPhA", "nPhB", "Vbias"]]; PWDescr.SetTypeBit[descr, "nPhA"]; PWDescr.SetTypeBit[descr, "nPhB"]; PWDescr.SetTypeBit[descr, "Vbias"]; END; InitDescrRamPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ EmptyDescrRamPU[]; PWDescr.SetTypeBit[descr, "nPhA", FALSE]; PWDescr.SetTypeBit[descr, "nPhB", TRUE]; PWDescr.SetTypeBit[descr, "Vbias", TRUE]; END; <<>> EmptyDescrRegsPD: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["PhA", "PhB", "nhold2BA", "nrejectBA", "DExecute", "DStateAddress", "EUAluLeftSrc1BA", "EUAluRightSrc1BA", "EUStore2ASrc1BA", "EUSt3AisCBus2BA", "EURes3AisCBus2BA", "FDInsert", "FDMask", "FDShift", "EUAluOp2AB", "EULoadField3BA", "EUWriteToPBus3AB", "EURes3BisPBus3AB"]]; PWDescr.SetTypeBit[descr, "PhA"]; PWDescr.SetTypeBit[descr, "PhB"]; PWDescr.SetTypeBit[descr, "nhold2BA"]; PWDescr.SetTypeBit[descr, "nrejectBA"]; PWDescr.SetTypeBit[descr, "DExecute"]; PWDescr.SetTypeInt[descr, "DStateAddress", 4]; PWDescr.SetTypeInt[descr, "EUAluLeftSrc1BA", 2]; PWDescr.SetTypeInt[descr, "EUAluRightSrc1BA", 2]; PWDescr.SetTypeInt[descr, "EUStore2ASrc1BA", 2]; PWDescr.SetTypeBool[descr, "EUSt3AisCBus2BA"]; PWDescr.SetTypeBool[descr, "EURes3AisCBus2BA"]; PWDescr.SetTypeBool[descr, "FDInsert"]; PWDescr.SetTypeInt[descr, "FDMask", 6]; PWDescr.SetTypeInt[descr, "FDShift", 6]; PWDescr.SetTypeInt[descr, "EUAluOp2AB", 5]; PWDescr.SetTypeBit[descr, "EULoadField3BA"]; PWDescr.SetTypeBool[descr, "EUWriteToPBus3AB"]; PWDescr.SetTypeBool[descr, "EURes3BisPBus3AB"]; END; EmptyDescrRegsPU: PUBLIC PROC RETURNS [descr: PWDescr.Descriptor] = BEGIN descr _ PWDescr.RopesToDescr[LIST["nPhA", "nPhB", "Vbias"]]; PWDescr.SetTypeBit[descr, "nPhA"]; PWDescr.SetTypeBit[descr, "nPhB"]; PWDescr.SetTypeBit[descr, "Vbias"]; END; <<-- And now the pipeline registers>> PipeLineRegsGen: PUBLIC PROC [design: CD.Design] RETURNS [pipe: PW.ObPtr] = BEGIN leftOp2AB, rightOp2AB, store2AB, store2BA, store3AB: PW.ObPtr; LeftOp2ABGen: PROC RETURNS [leftOp2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; -- remember that AbutY builds UP PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 0]; -- aBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluLeftSrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["ap", "r", "c"], out: "opL", ctrlListOb: listOb]]; leftOp2AB _ EUtils.MakeRegWithDBus[design, regD, lOp2AB]; END; RightOp2ABGen: PROC RETURNS [rightOp2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 0]; -- bBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 3]; -- kBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUAluRightSrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["bs", "r", "c", "k"], out: "opR", ctrlListOb: listOb]]; rightOp2AB _ EUtils.MakeRegWithDBus[design, regD, rOp2AB]; END; Store2ABGen: PROC RETURNS [store2AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 0]; -- bBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 1]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 2]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetInt[regscdpd, "EUStore2ASrc1BA", 0, 0]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["bs", "r", "c"], out: "down", ctrlListOb: listOb, interruptBuses: LIST["apBus", "bsBus"]]]; <> store2AB _ EUtils.MakeReg[design, regD]; END; Store2BAGen: PROC RETURNS [store2BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; -- no control regD _ NEW[EUtils.RegDescrRec _ [inListOb: LIST["top"], out: "down", ctrlListOb: listOb, cutTopBot: TRUE]]; store2BA _ EUtils.MakeReg[design, regD ]; END; Store3ABGen: PROC RETURNS [store3AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", TRUE]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", FALSE]; -- store2BA listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EUSt3AisCBus2BA", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["top", "c"], out: "ap", ctrlListOb: listOb, interruptBuses: LIST["downBus"]]]; store3AB _ EUtils.MakeRegWithDBus[design, regD, st3AB]; END; PW.Output["The top pipeline registers", "\n"]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhB", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhA", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; <<-- PhA latches>> leftOp2AB _ LeftOp2ABGen[]; rightOp2AB _ RightOp2ABGen[]; store2AB _ Store2ABGen[]; store3AB _ Store3ABGen[]; <<-- PhB latches>> regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhA", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhB", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; -- really??? store2BA _ Store2BAGen[]; pipe _ PW.AbutY[design, store3AB, store2BA, store2AB, rightOp2AB, leftOp2AB]; PW.RenameObject[design, pipe, "pipelineRegisters"]; END; ResultRegsGen: PUBLIC PROC [design: CD.Design] RETURNS [resultRegs: PW.ObPtr] = BEGIN result2BA, result3AB, result3BA, dataDriver, addrDriver: PW.ObPtr; Result2BAGen: PROC RETURNS [result2BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; <<-- no special control>> listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["bs"], out: "r", ctrlListOb: listOb, interruptBuses: LIST["opLBus", "opRBus", "downBus"]]]; result2BA _ EUtils.MakeRegWithDBus[design, regD, r2BA]; END; Result3ABGen: PROC RETURNS [result3AB: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", FALSE]; -- rBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", TRUE]; -- cBus listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EURes3AisCBus2BA", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["r", "c"], out: "opL", ctrlListOb: listOb]]; result3AB _ EUtils.MakeRegWithDBus[design, regD, r3AB]; END; Result3BAGen: PROC RETURNS [result3BA: PW.ObPtr] = BEGIN regD: EUtils.RegDescr; listOb: PW.ListOb _ NIL; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE]; -- from result3AB (opL) listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", TRUE]; -- pPort (opR) listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE, FALSE]; -- clean-up regD _ NEW[EUtils.RegDescrRec _ [ inListOb: LIST["opL", "top"], out: "c", ctrlListOb: listOb]]; result3BA _ EUtils.MakeRegWithDBus[design, regD, r3BA]; END; BottomGen: PROC RETURNS [bottom: PW.ObPtr] = BEGIN BottomCtrlGen: PROC RETURNS [bottomCtrl: PW.ObPtr] = BEGIN index: INT _ 1; GndProc: PW.SelectNamesProc = {keepIt _ Rope.Equal[name, "gnd"]}; RenameEULoadField3BA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EULoadField3BA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameNRejectBA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "nrejectBA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameNHold2BA: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "nhold2BA"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameEURes3BisPBus3AB: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EURes3BisPBus3AB"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameEUWriteToPBus3AB: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "EUWriteToPBus3AB"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; RenameDExecute: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ "DExecute"; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; listOb: PW.ListOb _ NIL; gndConnect, gndRect, wires, wire: PW.ObPtr; size: CD.Position; <<-- wires: connect all leftover wires>> regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; <<-- EULoadField3BA>> PWDescr.SetBit[regscdpd, "EULoadField3BA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameEULoadField3BA], listOb]; PWDescr.SetBit[regscdpd, "EULoadField3BA", FALSE]; <<-- nrejectBA>> PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "nrejectBA", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameNRejectBA], listOb]; <<-- nhold2BA>> PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "nhold2BA", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameNHold2BA], listOb]; <<-- EURes3BisPBus3AB>> PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBool[regscdpd, "EURes3BisPBus3AB", FALSE, FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameEURes3BisPBus3AB], listOb]; <<-- EUWriteToPBus3AB>> PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", FALSE, FALSE]; -- clean-up listOb _ CONS[PWPins.RenamePins[design, wire, RenameEUWriteToPBus3AB], listOb]; <<-- DExecute>> PWDescr.SetBit[regscdpd, "DExecute", TRUE]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; PWDescr.SetBit[regscdpd, "DExecute", FALSE]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameDExecute], listOb]; <<-- DStateAddress>> FOR i: INT IN [0..4) DO RenameDStateAddress: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "wireLeft"] => newRope _ PWPins.Index["DStateAddress", i]; Rope.Equal[oldRope, "wireRight"] => newRope _ NIL; ENDCASE => newRope _ oldRope}; PWDescr.SetInt[regscdpd, "DStateAddress", index, index]; wire _ EuControl.RouteTo[design, regscdpd, regscdpu]; listOb _ CONS[PWPins.RenamePins[design, wire, RenameDStateAddress], listOb]; index _ 2*index; ENDLOOP; PWDescr.SetInt[regscdpd, "DStateAddress", 0, 0]; <<-- Assemble all these wires>> wires _ PW.AbutListY[design, listOb]; <<-- Now the m2 comb>> gndConnect _ EUtils.CtrlFiller[design, wires, bottomDataPath, GndProc]; size _ PW.Size[gndConnect]; gndRect _ PWCmos.Rect[CMos.met2, [size.x, size.y-10* PW.IncludeInCell[design, gndConnect, gndRect, [0, 0]]; [] _ CDCells.RepositionCell[gndConnect, design]; bottomCtrl _ PW.AbutY[design, gndConnect, wires]; END; bottomDataPath, botDP: PW.ObPtr; listOb: PW.ListOb _ NIL; bottomDataPath _ PW.Get[design, "bottomDataPath"]; FOR i: INT IN [0..nbSlices) DO RenameEPData: PWPins.RenameProc = {SELECT TRUE FROM Rope.Equal[oldRope, "EPData"] => newRope _ PWPins.Index[oldRope, nbSlices-i-1]; ENDCASE => newRope _ oldRope;}; listOb _ CONS[PWPins.RenamePins[design, bottomDataPath, RenameEPData], listOb]; ENDLOOP; botDP _ PW.AbutListX[design, listOb]; bottom _ EUtils.Assemble[design, BottomCtrlGen[], botDP,, Bottom]; END; AddrDriverGen: PROC RETURNS [addrDriver: PW.ObPtr] = BEGIN listOb: PW.ListOb _ NIL; <<-- Cache access: address, always on PhA>> listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu], listOb]; addrDriver _ EUtils.MakeTstDriver[design: design, in: "r", out: "downOut", ctrlListOb: listOb]; END; DataDriverGen: PROC RETURNS [dataDriver: PW.ObPtr] = BEGIN listOb: PW.ListOb _ NIL; <<-- Cache access: data>> PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", TRUE]; listOb _ CONS[EuControl.Nand[design, regscdpd, regscdpu, TRUE], listOb]; PWDescr.SetBool[regscdpd, "EUWriteToPBus3AB", FALSE, FALSE]; -- clean-up dataDriver _ EUtils.MakeTstDriver[design: design, in: "ap", out: "downOut", ctrlListOb: listOb]; END; PW.Output["The bottom pipeline registers", "\n"]; regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; <<-- PhA latch>> PWDescr.SetBit[regscdpu, "nPhB", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhA", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; PWDescr.SetBit[regscdpd, "nrejectBA", TRUE]; result3AB _ Result3ABGen[]; addrDriver _ AddrDriverGen[]; <<-- PhB latches>> regscdpd _ EmptyDescrRegsPD[]; regscdpu _ EmptyDescrRegsPU[]; PWDescr.SetBit[regscdpu, "nPhA", TRUE]; PWDescr.SetBit[regscdpu, "Vbias", TRUE]; PWDescr.SetBit[regscdpd, "PhB", TRUE]; PWDescr.SetBit[regscdpd, "nhold2BA", TRUE]; -- really??? result2BA _ Result2BAGen[]; result3BA _ Result3BAGen[]; dataDriver _ DataDriverGen[]; resultRegs _ PW.AbutY[design, BottomGen[], dataDriver, addrDriver, result3BA, result3AB, result2BA]; PW.RenameObject[design, resultRegs, "resultRegisters"]; END; END. <<>>