OnionCoreTest.mesa
Bertrand Serlet February 10, 1987 4:50:05 pm PST
DIRECTORY
CD, CMosB, CDBasics, CDCells, Core, CoreOps, CoreGeometry, HashTable, IO, OnionCore, PW, PWCore, Rope, Sinix, TerminalIO;
OnionCoreTest: CEDAR PROGRAM
IMPORTS CD, CDBasics, CDCells, CMosB, CoreOps, CoreGeometry, HashTable, IO, OnionCore, PW, PWCore, Rope, Sinix, TerminalIO =
BEGIN OPEN Core, OnionCore;
OnionTest: PW.UserProc = {
innerCT: CellType ← PWCore.FromLayoutWithoutPublic[PW.Get[design, "inner.mask"]];
outerCT: CellType ← PWCore.FromLayoutWithoutPublic[PW.Get[design, "outer.mask"]];
inner: CD.Object ← PWCore.Layout[innerCT];
outer: CD.Object ← PWCore.Layout[outerCT];
nets: HashTable.Table ← HashTable.Create[5, HashTable.RopeEqual, HashTable.HashRope];
innerPos: CD.Position ← [74*CMosB.lambda, 69*CMosB.lambda];
innerPinsEnumeration: BOOL;
AddPinsToNets: CoreOps.EachWireProc = {
EachPin: CoreGeometry.EachPinProc = {
seg: Seg;
IF layer#CMosB.met THEN {
TerminalIO.PutF["*** %g pin %g not made of met but of %g discarded\n", IO.rope[IF innerPinsEnumeration THEN "Inner" ELSE "Outer"], IO.rope[name], IO.atom[CD.LayerKey[layer]]];
RETURN;
};
IF innerPinsEnumeration THEN SELECT side FROM
top, bottom  => {min ← min + innerPos.x; max ← max + innerPos.x};
left, right  => {min ← min + innerPos.y; max ← max + innerPos.y};
ENDCASE     => ERROR;
seg ← SELECT side FROM
top, left  => NEW [OnionCore.SegRec ← [max, min, side, side]],
bottom, right => NEW [OnionCore.SegRec ← [min, max, side, side]],
ENDCASE     => ERROR;
IF innerPinsEnumeration THEN net.innerSegs ← CONS [seg, net.innerSegs] ELSE net.outerSegs ← CONS [seg, net.outerSegs];
};
name: ROPE ← CoreOps.GetShortWireName[wire];
net: Net ← NARROW [HashTable.Fetch[nets, name].value];
IF wire.size#0 THEN RETURN;
IF NOT Rope.Match[pattern: "Net*", object: name] THEN RETURN;
IF net=NIL THEN net ← NEW [NetRec ← [name: name]];
IF Rope.Equal[name, "Net2"] THEN {net.width ← 8*CMosB.lambda; net.routeEveryOuterSeg ← FALSE};
IF Rope.Equal[name, "Net3"] THEN {net.routeEveryOuterSeg ← FALSE};
[] ← PWCore.InterestRect[IF innerPinsEnumeration THEN innerCT ELSE outerCT]; -- to make sure the cellType is decorated
[] ← CoreGeometry.EnumerateSides[PWCore.extractMode.decoration, IF innerPinsEnumeration THEN innerCT ELSE outerCT, wire, EachPin];
[] ← HashTable.Store[nets, name, net];
};
ob ← CDCells.CreateEmptyCell[];
innerPinsEnumeration ← TRUE; [] ← CoreOps.VisitWire[innerCT.public, AddPinsToNets];
innerPinsEnumeration ← FALSE; [] ← CoreOps.VisitWire[outerCT.public, AddPinsToNets];
[] ← CDCells.IncludeOb[design: NIL, cell: ob, ob: inner, trans: [CDBasics.SubPoints[innerPos, CD.InterestBase[inner]]], mode: dontResize];
[] ← CDCells.IncludeOb[design: NIL, cell: ob, ob: outer, trans: [CDBasics.SubPoints[[0, 0], CD.InterestBase[outer]]], mode: dontResize];
IF NOT IncludeInOuter[ob, nets, innerPos, CD.InterestSize[inner], CD.InterestSize[outer]] THEN TerminalIO.PutF["*** Did not finish properly!\n"];
[] ← CDCells.ResizeCell[NIL, ob];
CoreOps.Print[Sinix.Extract[ob, PWCore.extractMode].result, TerminalIO.CreateStream[]];
};
PW.Register[OnionTest, "OnionTest"];
END.