IFUPWCMos:
CEDAR
PROGRAM
IMPORTS CMosB, CMosBObjects, CDSimpleRules
EXPORTS IFUPW =
BEGIN
cmos: PUBLIC CD.Technology = CMosB.cmosB;
cmosNDif: PUBLIC CD.Layer ← CMosB.ndif;
cmosPDif: PUBLIC CD.Layer ← CMosB.pdif;
cmosWPDif: PUBLIC CD.Layer ← CMosB.wpdif;
cmosWNDif: PUBLIC CD.Layer ← CMosB.wndif;
cmosPoly: PUBLIC CD.Layer ← CMosB.pol;
cmosMet: PUBLIC CD.Layer ← CMosB.met;
cmosMet2: PUBLIC CD.Layer ← CMosB.met2;
cmosPWCont: PUBLIC CD.Layer ← CMosB.pwellCont;
cmosNWCont: PUBLIC CD.Layer ← CMosB.nwellCont;
cmosNWell: PUBLIC CD.Layer ← CMosB.nwell;
lambda: PUBLIC INT ← CMosB.lambda;
pwrW: PUBLIC INT ← 5*lambda;
metW: PUBLIC INT ← 3*lambda;
met2W: PUBLIC INT ← 4*lambda;
polW: PUBLIC INT ← 2*lambda;
difW: PUBLIC INT ← 2*lambda;
topTail: PUBLIC INT ← 2*lambda;
leftTail: PUBLIC INT ← 5*lambda;
botTail: PUBLIC INT ← 1*lambda;
cnctSize: PUBLIC INT ← 4*lambda;
metPitch: PUBLIC INT ← 8*lambda;
met2Pitch: PUBLIC INT ← 8*lambda;
polMuxPitch: PUBLIC INT ← 8*lambda;
polPitch: PUBLIC INT ← 6*lambda; -- without adjacent contacts
cellBody: INT ← 56*lambda;
cellWidth: PUBLIC INT ← IFUPW.nofVWires*metPitch+cellBody;
Contact:
PUBLIC
PROC[layer:
CD.Layer]
RETURNS[cntc:
CD.Object] = {
RETURN[
SELECT layer
FROM
cmosMet2, cmosPoly, cmosNDif, cmosPDif, cmosWPDif, cmosWNDif =>
CDSimpleRules.Contact[cmosMet, layer],
cmosPWCont, cmosNWCont =>
CMosBObjects.CreateDifCon[layer],
ENDCASE => ERROR]};
TransistorObject:
PUBLIC
PROC[size: IFUPW.Size, difLayer:
CD.Layer]
RETURNS[trans:
CD.Object]=
{trans ← CMosBObjects.CreateTransistor[size: size, difLayer: difLayer]};
IF metW # CDSimpleRules.MinWidth[cmosMet] THEN ERROR;
IF met2W # CDSimpleRules.MinWidth[cmosMet2] THEN ERROR;
IF polW # CDSimpleRules.MinWidth[cmosPoly] THEN ERROR;
IF difW # CDSimpleRules.MinWidth[cmosNDif] THEN ERROR;
END.