<> <> <> <<>> DIRECTORY CD, Core, CoreFlat, DABasics, RefTab, Rope, SoftHdwBasics; SoftHdwPlaceAndRoute: CEDAR DEFINITIONS = BEGIN <> <> <> NodePositions: TYPE = LIST OF NodePosition; NodePosition: TYPE = REF NodePositionRec; NodePositionRec: TYPE = RECORD [ type: NodeType, position: SoftHdwBasics.ArrayPosition]; NodeType: TYPE = {horizontalShort, verticalShort, horizontalLong, verticalLong}; <> <> Primitives: TYPE = REF PrimitivesRec; PrimitivesRec: TYPE = RECORD [ each: RefTab.Ref _ NIL, -- maps Core.CellType to Primitive publics: RefTab.Ref _ NIL]; -- maps Core.Wire to PrimitivePublic. <> Primitive: TYPE = REF PrimitiveRec; PrimitiveRec: TYPE = RECORD [ resources: NodePositions, tile: CD.Object]; <> PrimitivePublic: TYPE = REF PrimitivePublicRec; PrimitivePublicRec: TYPE = RECORD [ positions: NodePositions _ NIL, output: BOOL _ FALSE]; <> LoadLibrary: PROC RETURNS [primitives: Primitives]; <> <<>> Transform: PROC [oldRoot: Core.CellType, primitives: Primitives] RETURNS [newRoot: Core.CellType]; <> <<>> <> Placement: TYPE = REF PlacementRec; PlacementRec: TYPE = RECORD [ root: Core.CellType, primitives: Primitives, positions: RefTab.Ref]; -- maps CoreFlat.FlatCellType to PositionRef PositionRef: TYPE = REF DABasics.Position; Place: PROC [root: Core.CellType, primitives: Primitives] RETURNS [placement: Placement]; <> PlacementToCD: PROC [placement: Placement] RETURNS [object: CD.Object]; MouseToCellPair: PROC [design: CD.Design, position: DABasics.Position, placement: Placement] RETURNS [legal, leftRight: BOOL _ FALSE, leftTop, rightBottom: CoreFlat.FlatCellType _ NIL]; <> <> <<>> Surface: TYPE = REF SurfaceRec; SurfaceRec: TYPE = RECORD [ sizes: SoftHdwBasics.ArrayPosition, flatWires: RefTab.Ref, -- maps CoreFlat.FlatWire to Nodes nodes: RefTab.Ref]; -- maps NodePosition to Node Nodes: TYPE = LIST OF Node; Node: TYPE = REF NodeRec; NodeRec: TYPE = RECORD [ position: NodePosition, flatCell: CoreFlat.FlatCellType _ NIL, flatWire: CoreFlat.FlatWire _ NIL, equivalenceClass: REF _ NIL, output: BOOL, arcs: SEQUENCE size: ArcIndex OF Arc]; <> <<>> ArcIndex: TYPE = CARDINAL; Arcs: TYPE = LIST OF Arc; Arc: TYPE = REF ArcRec; ArcRec: TYPE = RECORD [ flatWire: CoreFlat.FlatWire _ NIL, -- nil means unassigned direction: ArcDirection, this, that: Node _ NIL]; -- never nil after creation ArcDirection: TYPE = {thisToThat, thatToThis}; CreateSurface: PROC [sizes: SoftHdwBasics.ArrayPosition] RETURNS [surface: Surface]; <> PlaceSurface: PROC [surface: Surface, placement: Placement]; <> RouteSurface: PROC [surface: Surface]; <> MarkSurfaceDirections: PROC [surface: Surface]; <> EmitSurface: PROC [surface: Surface, placement: Placement] RETURNS [object: CD.Object]; <> END.