-- procedure exporting module of silicon (pretty picture) program
-- last modified by McCreight, December 3, 1982 9:51 AM
-- to eliminate repeated objects
DIRECTORY
SegmentDefs,
StringDefs,
ppddefs,
ppdddefs,pppdefs,
ppdefs;
ppprocs8: PROGRAM IMPORTS pppdefs EXPORTS pppdefs =
BEGIN OPEN ppdefs, ppddefs, pppdefs, SegmentDefs;
drPu0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO xstr object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN
ELSE
BEGIN
x1: locNum = x + p.wExt;
y1: locNum = y + p.lExt;
middleX: locNum = x + p.size[0]/2;
metal: Rect = [x1: middleX-2*Lambda, y1:y+p.size[1]-6*Lambda,
x2: middleX+2*Lambda, y2: y+p.size[1]];
pr.orArea[x1, y, x1 + p.width, y+p.size[1], dif, @pr.r];
pr.orArea[x, y1, x + p.size[0], y1 + p.length, pol, @pr.r];
pr.orArea[x, y, x + p.size[0], metal.y2-Lambda,
imp, @pr.r];
pr.orArea[metal.x1, metal.y1+2*Lambda, metal.x2, metal.y2,
dif, @pr.r];
pr.orArea[metal.x1, metal.y1, metal.x2, metal.y2, met, @pr.r];
pr.saveArea[metal.x1+Lambda, metal.y1+Lambda,
metal.x2-Lambda, metal.y2-Lambda, cut, @pr.r];
END;
END;
drPu2: PUBLIC drProc =
{drArb[drPu0, 4, ob, x, y, pr]};
drPu4: PUBLIC drProc =
{drArb[drPu0, 8, ob, x, y, pr]};
drPu6: PUBLIC drProc =
{drArb[drPu0, 12, ob, x, y, pr]};
drWire0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO wire object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], p.l, @pr.r];
END;
drWire2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO wire object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], p.l, @pr.r];
END;
drPWire0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO wire object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
-- OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x-p.surround, y-p.surround, x + p.size[0]+p.surround, y + p.size[1]+p.surround, nwel, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], p.l, @pr.r];
END;
drPWire2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO wire object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
-- OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x-p.surround, y-p.surround, x + p.size[1]+p.surround, y + p.size[0]+p.surround, nwel, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], p.l, @pr.r];
END;
drBC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1]/2, pol, @pr.r];
pr.orArea[x, y + p.magicN*2, x + p.size[0], y + p.size[1], dif, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y + p.magicN + p.size[0], cut, @pr.r];
END;
drBC2: PUBLIC drProc =
{drArb[drBC0, 4, ob, x, y, pr]};
drBC4: PUBLIC drProc =
{drArb[drBC0, 8, ob, x, y, pr]};
drBC6: PUBLIC drProc =
{drArb[drBC0, 12, ob, x, y, pr]};
drMDC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met2, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x+p.m2Ext, y+p.m2Ext, x-p.m2Ext + p.size[0], y-p.m2Ext + p.size[1], p.l, @pr.r];
pr.saveArea[
x + p.c2Ext, y + p.c2Ext, x - p.c2Ext + p.size[0],
y - p.c2Ext + p.size[1], cut2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y - p.magicN + p.size[1], cut, @pr.r];
END;
drMDC2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], met2, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], met, @pr.r];
pr.orArea[x+p.m2Ext, y+p.m2Ext, x-p.m2Ext + p.size[1], y-p.m2Ext + p.size[0], p.l, @pr.r];
pr.saveArea[
x + p.c2Ext, y + p.c2Ext, x - p.c2Ext + p.size[1],
y - p.c2Ext + p.size[0], cut2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[1],
y - p.magicN + p.size[0], cut, @pr.r];
END;
drDC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], p.l, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y - p.magicN + p.size[1], cut, @pr.r];
END;
drDC2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], met, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], p.l, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[1],
y - p.magicN + p.size[0], cut, @pr.r];
END;
drPDC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
-- OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], p.l, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y - p.magicN + p.size[1], cut, @pr.r];
pr.orArea[x-p.surround, y-p.surround, x + p.size[0]+p.surround, y + p.size[1]+p.surround, nwel, @pr.r];
END;
drPDC2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
-- OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], met, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], p.l, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[1],
y - p.magicN + p.size[0], cut, @pr.r];
pr.orArea[x-p.surround, y-p.surround, x + p.size[1]+p.surround, y + p.size[0]+p.surround, nwel, @pr.r];
END;
drMPDC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
-- OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met2, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x+p.m2Ext, y+p.m2Ext, x-p.m2Ext + p.size[0], y-p.m2Ext + p.size[1], p.l, @pr.r];
pr.saveArea[
x + p.c2Ext, y + p.c2Ext, x - p.c2Ext + p.size[0],
y - p.c2Ext + p.size[1], cut2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y - p.magicN + p.size[1], cut, @pr.r];
pr.orArea[x-p.surround+p.m2Ext, y-p.surround+p.m2Ext, x + p.size[0]+p.surround-p.m2Ext, y + p.size[1]+p.surround-p.m2Ext, nwel, @pr.r];
END;
drMPDC2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
-- IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
-- OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], met2, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], met, @pr.r];
pr.orArea[x+p.m2Ext, y+p.m2Ext, x-p.m2Ext + p.size[1], y-p.m2Ext + p.size[0], p.l, @pr.r];
pr.saveArea[
x + p.c2Ext, y + p.c2Ext, x - p.c2Ext + p.size[1],
y - p.c2Ext + p.size[0], cut2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[1],
y - p.magicN + p.size[0], cut, @pr.r];
pr.orArea[x-p.surround+p.m2Ext, y-p.surround+p.m2Ext, x + p.size[1]+p.surround-p.m2Ext, y + p.size[0]+p.surround-p.m2Ext, nwel, @pr.r];
END;
drMM0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[0], y + p.size[1], met, @pr.r];
pr.orArea[x, y, x + p.size[0], y + p.size[1], met2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[0],
y - p.magicN + p.size[1], cut2, @pr.r];
END;
drMM2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x, y, x + p.size[1], y + p.size[0], met, @pr.r];
pr.orArea[x, y, x + p.size[1], y + p.size[0], met2, @pr.r];
pr.saveArea[
x + p.magicN, y + p.magicN, x - p.magicN + p.size[1],
y - p.magicN + p.size[0], cut2, @pr.r];
END;
drBuC0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x+p.wExt,y,x+p.size[0]-p.wExt+p.magicN,y+p.size[1], pol, @pr.r];
pr.orArea[x,y+p.lExt,x+p.size[0],y+p.size[1]-p.lExt, dif, @pr.r];
pr.saveArea[x,y,x+p.size[0],y+p.size[1],bur,@pr.r];
END;
drBuC2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x,y+p.wExt,x+p.size[1],y+p.size[0]-p.wExt+p.magicN,pol,@pr.r];
pr.orArea[x+p.lExt,y,x+p.size[1]-p.lExt,y+p.size[0],dif,@pr.r];
pr.saveArea[x,y,x+p.size[1],y+p.size[0],bur,@pr.r];
END;
drBuC4: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
pr.orArea[x+p.wExt-p.magicN,y,x+p.size[0]-p.wExt,y+p.size[1], pol, @pr.r];
pr.orArea[x,y+p.lExt,x+p.size[0],y+p.size[1]-p.lExt, dif, @pr.r];
pr.saveArea[x,y,x+p.size[0],y+p.size[1],bur,@pr.r];
END;
drBuC6: PUBLIC drProc =
BEGIN
p: LONG POINTER TO cont object = LOOPHOLE[ob];
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
pr.orArea[x,y+p.wExt-p.magicN,x+p.size[1],y+p.size[0]-p.wExt,pol,@pr.r];
pr.orArea[x+p.lExt,y,x+p.size[1]-p.lExt,y+p.size[0],dif,@pr.r];
pr.saveArea[x,y,x+p.size[1],y+p.size[0],bur,@pr.r];
END;
drBus0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
y←y+p.offsetFirst;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+wid,y+len,p.l,@pr.r];
x←x+p.wspace;
y←y+p.topIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBus2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
x←x+p.size[1]-len-p.offsetFirst;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+len,y+wid,p.l,@pr.r];
y←y+p.wspace;
x←x-p.topIncr-p.lenIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBus4: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
x←x+p.size[0]-wid;
y←y+p.size[1]-len-p.offsetFirst;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+wid,y+len,p.l,@pr.r];
x←x-p.wspace;
y←y-p.topIncr-p.lenIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBus6: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
x←x+p.offsetFirst;
y←y+p.size[0]-wid;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+len,y+wid,p.l,@pr.r];
y←y-p.wspace;
x←x+p.topIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBusR0: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
y←y+p.offsetFirst;
x←x+p.size[0]-wid;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+wid,y+len,p.l,@pr.r];
x←x-p.wspace;
y←y+p.topIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBusR2: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
x←x+p.offsetFirst;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+len,y+wid,p.l,@pr.r];
y←y+p.wspace;
x←x+p.topIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBusR4: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[0] < pr.r.x1
OR y + p.size[1] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
y←y+p.size[1]-len-p.offsetFirst;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+wid,y+len,p.l,@pr.r];
x←x+p.wspace;
y←y-p.topIncr-p.lenIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
drBusR6: PUBLIC drProc =
BEGIN
p: LONG POINTER TO bus object = LOOPHOLE[ob];
len,wid:INTEGER;
IF x > pr.r.x2 OR y > pr.r.y2 OR x + p.size[1] < pr.r.x1
OR y + p.size[0] < pr.r.y1 THEN RETURN;
wid←p.wwidth;
len←p.firstLength;
x←x+p.size[1]-len-p.offsetFirst;
y←y+p.size[0]-wid;
THROUGH [0..p.wCnt) DO
pr.orArea[x,y,x+len,y+wid,p.l,@pr.r];
y←y-p.wspace;
x←x-p.topIncr-p.lenIncr;
len←len+p.lenIncr;
ENDLOOP;
END;
END.