PrismArrayPW:
CEDAR PROGRAM IMPORTS PW =
BEGIN
mulLib: PW.Design ← PW.OpenDesign["///Users/gunther.pa/chips/PrismCellLib.dale"];
--AND gates
NorIn: PW.Object ← PW.Get[mulLib, "NorLeft"];
Nor: PW.Object ← PW.Get[mulLib, "NorTop"];
OBufNoOp: PW.Object ← PW.Get[mulLib, "OBuffNull"];
--Adder pieces
Nand: PW.Object ← PW.Get[mulLib, "NandIn"];
TGA: PW.Object ← PW.Get[mulLib, "TGAdder"];
OBuf: PW.Object ← PW.Get[mulLib, "OBuffer"];
--Final sum pieces
CLALeft: PW.Object ← PW.Get[mulLib, "CLAdderIn"];
CLA: PW.Object ← PW.Get[mulLib, "CLAdder"];
CLARight : PW.Object ← PW.Get[mulLib, "CLaddBuf"];
--Propogate pieces
PropLeft: PW.Object ← PW.Get[mulLib, "PropIn"];
PropBuf: PW.Object ← PW.Get[mulLib, "OBufProp"];
PropRight: PW.Object ← PW.Get[mulLib, "PropBufNull"];
XBits, YBits: INT ← 4;
ArrayGen:
PW.UserProc = {
NorRow: PW.Object ← PW.ArrayX[Nor, XBits-1];
fullNorRow: PW.Object ← PW.AbutX[NorIn, NorRow, OBufNoOp];
TGARow: PW.Object ← PW.ArrayX[TGA, XBits-1];
mulRow: PW.Object ← PW.AbutX[Nand, TGARow, OBuf];
fullMULArray: PW.Object ← PW.ArrayY[mulRow, YBits];
CLARow: PW.Object ← PW.ArrayX[CLA, XBits-1];
fullCLARow : PW.Object ← PW.AbutX[CLALeft, CLARow, CLARight];
PropArray: PW.Object ← PW.ArrayX[PropBuf, XBits-1];
fullPropRow: PW.Object ← PW.AbutX[PropLeft , PropArray, PropRight];
--NOTE: arg order
MUL: PW.Object ← PW.AbutY[fullPropRow, fullCLARow, fullMULArray, fullNorRow];
--CleanUp: PROC [design];
RETURN[MUL];
};
NorRowGen:
PW.UserProc = {
NorRow: PW.Object ← PW.ArrayX[Nor, XBits-1];
fullNorRow: PW.Object ← PW.AbutX[NorIn, NorRow, OBufNoOp];
--CleanUp: PROC [design];
RETURN[fullNorRow];
};
TGARowGen:
PW.UserProc = {
TGARow: PW.Object ← PW.ArrayX[TGA, XBits-1];
fullTGARow: PW.Object ← PW.AbutX[Nand, TGARow, OBuf];
--CleanUp: PROC [design];
RETURN[fullTGARow];
};
CLARowGen:
PW.UserProc = {
CLARow: PW.Object ← PW.ArrayX[CLA, XBits-1];
fullCLARow: PW.Object ← PW.AbutX[CLALeft, CLARow, CLARight];
--CleanUp: PROC [design];
RETURN[fullCLARow];
};
PropRowGen:
PW.UserProc = {
PropArray: PW.Object ← PW.ArrayX[PropBuf, XBits-1];
fullPropRow: PW.Object ← PW.AbutX[PropLeft , PropArray, PropRight];
--CleanUp: PROC [design];
RETURN[fullPropRow];
};
GiantArrayGen: PW.UserProc = {
Used to generate a 16x16 bit systolic multiplier < 10,000 xtors.
On February 19, 1986, cell dimension was 3326x2500 (mm).
Used by G. Beretta to test SOS. February 19, 1986 7:56:14 pm PST
BigXBits, BigYBits: INT ← 16;
NorRow: PW.Object ← PW.ArrayX[Nor, BigXBits-1];
fullNorRow: PW.Object ← PW.AbutX[NorIn, NorRow, OBufNoOp];
TGARow: PW.Object ← PW.ArrayX[TGA, BigXBits-1];
mulRow: PW.Object ← PW.AbutX[Nand, TGARow, OBuf];
fullMULArray: PW.Object ← PW.ArrayY[mulRow, BigYBits];
CLARow: PW.Object ← PW.ArrayX[CLA, BigXBits-1];
fullCLARow: PW.Object ← PW.AbutX[CLALeft, CLARow, CLARight];
PropArray: PW.Object ← PW.ArrayX[PropBuf, BigXBits-1];
fullPropRow: PW.Object ← PW.AbutX[PropLeft , PropArray, PropRight];
--NOTE: arg order
MUL: PW.Object ← PW.AbutY[fullPropRow, fullCLARow, fullMULArray, fullNorRow];
--CleanUp: PROC [design];
RETURN[MUL];
};
PW.Register[NorRowGen, "NorRow"];
PW.Register[TGARowGen, "TGARow"];
PW.Register[CLARowGen, "CLARow"];
PW.Register[PropRowGen, "PropRow"];
PW.Register[ArrayGen, "PrismArray"];
PW.Register[GiantArrayGen, "GiantArray"];
END.