-- File: DJExtCap.mesa -- capactor routines used by the disjoint circuit extractor -- Written by Martin Newell/Dan Fitzpatrick July 1981 -- Last edited: 12-Aug-81 13:54:50 DIRECTORY DJExtAllocDefs: FROM "DJExtAllocDefs" USING [AllocateCap, FreeCap], DJExtCombineDefs: FROM "DJExtCombineDefs" USING [GetNode,AttachNode], DJExtCapDefs: FROM "DJExtCapDefs", DJExtMergeDefs: FROM "DJExtMergeDefs" USING [Lookup,LookSmall,IsSmall], DJExtTypes: FROM "DJExtTypes" USING [Node, NodeRecord, NodeNumber, CapLayer,poly,diff,metal,gate], Runtime: FROM "Runtime" USING [CallDebugger]; DJExtCap: PROGRAM IMPORTS DJExtAllocDefs, DJExtCombineDefs, DJExtMergeDefs, Runtime EXPORTS DJExtCapDefs = BEGIN OPEN DJExtAllocDefs, DJExtCombineDefs, DJExtMergeDefs, DJExtTypes, Runtime; FindCap: PUBLIC PROCEDURE[num:NodeNumber] RETURNS[node:Node] = BEGIN node _ GetNode[num]; IF node # NIL THEN RETURN; node _ MakeCap[]; node.node _ Lookup[num]; AttachNode[node.node,node]; END; AddCapArea: PUBLIC PROCEDURE[cap:Node, layer:INTEGER, area:REAL] = BEGIN SELECT layer FROM poly => cap.carea[Poly] _ cap.carea[Poly] + area; diff => cap.carea[Diff] _ cap.carea[Diff] + area; metal => cap.carea[Metal] _ cap.carea[Metal] + area; ENDCASE => CallDebugger["bad layer in AddCapArea"]; END; AddCapPerim: PUBLIC PROCEDURE[cap:Node, layer:INTEGER, perim:REAL] = BEGIN SELECT layer FROM poly => cap.cperim[Poly] _ cap.cperim[Poly] + perim; diff => cap.cperim[Diff] _ cap.cperim[Diff] + perim; metal => cap.cperim[Metal] _ cap.cperim[Metal] + perim; gate => cap.perim _ cap.perim + perim; -- might be a trans ENDCASE => CallDebugger["bad layer in AddCapPerim"]; END; CombineCap: PUBLIC PROCEDURE [c1,c2:Node] RETURNS[Node] = BEGIN FOR layer: CapLayer IN CapLayer DO c1.carea[layer] _ c1.carea[layer] + c2.carea[layer]; c1.cperim[layer] _ c1.cperim[layer] + c2.cperim[layer]; ENDLOOP; DeleteCap[c2]; RETURN[c1]; END; CopyCap: PUBLIC PROCEDURE[c:Node,offset:NodeNumber] RETURNS[cap:Node] = BEGIN cap _ AllocateCap[]; IF cList.next # NIL THEN cList.next.back _ cap; cap.next _ cList.next; cap.back _ @cList; cList.next _ cap; cap.node _ c.node+offset; cap.type _ Capacitor; FOR layer: CapLayer IN CapLayer DO cap.carea[layer] _ c.carea[layer]; cap.cperim[layer] _ c.cperim[layer]; ENDLOOP; END; MakeCap: PUBLIC PROCEDURE[] RETURNS[cap:Node] = BEGIN cap _ AllocateCap[]; IF cList.next # NIL THEN cList.next.back _ cap; cap.next _ cList.next; cap.back _ @cList; cList.next _ cap; cap.node _ 0; cap.type _ Capacitor; FOR layer: CapLayer IN CapLayer DO cap.carea[layer] _ 0; cap.cperim[layer] _ 0; ENDLOOP; END; DeleteCap: PUBLIC PROCEDURE[cap:Node] = BEGIN IF cap.next # NIL THEN cap.next.back _ cap.back; IF cap.back # NIL THEN cap.back.next _ cap.next ELSE CallDebugger["messed up on doubly linked lists for capacitor"]; cap.type _ Unknown; FreeCap[cap]; END; GetCapList: PUBLIC PROCEDURE RETURNS[cap:Node] = BEGIN cap _ cList.next; cList.next _ NIL; END; SelectCap: PUBLIC PROCEDURE RETURNS[intCap,extCap:Node] = BEGIN cap,next:Node; intCap _ NIL; extCap _ NIL; FOR cap _ GetCapList[],next UNTIL cap = NIL DO next _ cap.next; IF IsSmall[cap.node] THEN { -- it belongs on the external capacitor list cap.next _ extCap; extCap _ cap; } ELSE { -- it belongs on the internal capacitor list cap.next _ intCap; intCap _ cap; }; ENDLOOP; END; RenumberCap: PUBLIC PROCEDURE[cap:Node] = BEGIN FOR cap _ cap,cap.next UNTIL cap = NIL DO cap.node _ LookSmall[cap.node]; ENDLOOP; END; cList: cap NodeRecord; cList.next _ NIL; cList.back _ NIL; END. (672)\177b10B396b8B183b1B1b7B193b10B302b11B295i16I62b11B250b7B386b7B323b9B250b10B90b9B204i41I61i41I63b12B