<> <> <> <> <> DIRECTORY PW, Rope USING [ROPE]; PWRoute: CEDAR DEFINITIONS = BEGIN ROPE: TYPE = Rope.ROPE; <<>> <<-- AbutRoute: uses a channel router to connect adjacent objects>> AbutRouteListX: PROC [design: PW.Design, listOb: PW.ListOb, topListOb: PW.ListOb _ NIL, bottomListOb: PW.ListOb _ NIL, params: RouterParams _ defaultRouterParams] RETURNS [obj: PW.Object]; AbutRouteListY: PROC [design: PW.Design, listOb: PW.ListOb, rightListOb: PW.ListOb _ NIL, leftListOb: PW.ListOb _ NIL, params: RouterParams _ defaultRouterParams] RETURNS [obj: PW.Object]; <<>> <<-- All the parameters for the channel router>> RouterParams: TYPE = REF RouterParamsRec; RouterParamsRec: TYPE = RECORD [ trunkLayer: ROPE, -- "poly", "metal" or "metal2" branchLayer: ROPE, -- branch goes accross makeNetsProc: MakeNetsProc _ NIL, -- NIL means pinName=netName wireExtendProc: WireExtendProc _ NIL, -- to contact pin to wire wireWidthProc: WireWidthProc _ NIL -- to control the width of a wire ]; -- build the equivalent classes (nets) of pins MakeNetsProc: TYPE = PROC[pinName: ROPE] RETURNS [netName: ROPE]; -- how to connect to a pin WireExtendProc: TYPE = PROC RETURNS [PW.Object]; -- width of the wire for a given net WireWidthProc: TYPE = PROC [netName: ROPE] RETURNS [wireWidth: INT]; defaultRouterParams: RouterParams; <<-- Given two cells that we plan to abut, this module parses the corresponding edges, extracts the pins, builds nets according to the names on the pins, then calls the router to produce a cell containing the channel routing.>> MakeChannel: PUBLIC PROC[design: PW.Design, obj1, obj2, topOrRightObj, bottomOrLeftObj: PW.Object, params: RouterParams, isX: BOOL] RETURNS [channel: PW.Object]; END. <<>>