DIRECTORY CoreRouteFlat, CoreRouteFlatProcs, Imager USING [Context, PathProc, SetGray, SetXY, ShowRope, MaskBox, MaskStroke], IO, IP, IPConstants, IPToolBox, IPChipRose, IPNetTab, IPPortTab, Rope, SymTab; IPPortTabImpl: CEDAR PROGRAM IMPORTS CoreRouteFlatProcs, IO, Imager, SymTab, Rope, IP, IPChipRose, IPNetTab, IPToolBox EXPORTS IPPortTab = BEGIN OPEN TB: IPToolBox, CR: IPChipRose, IPPortTab; Create: PUBLIC PROC[chipRose: CR.Ref, netTab: IPNetTab.Ref] RETURNS [Ref] = { ports: SymTab.Ref _ SymTab.Create[]; eachPort: CR.EachPortAction ={ [] _ ports.Store[port, NEW[PortRep _ [name: port, eqClass: val.eqClass, net: IPNetTab.FetchNet[netTab, val.net]]]]; }; --eachPort chipRose.Ports[eachPort]; RETURN [NEW[Rep _ [ports]]]; }; --Create CreateFromStructure: PUBLIC PROC[structure: CoreRouteFlat.Structure, netTab: IPNetTab.Ref] RETURNS [Ref] = { EachPort: CoreRouteFlatProcs.EachNetONodeAction ={ -- PROC [instance: CoreRouteFlat.Instance, netONode: CoreRouteFlat.NetONode] RETURNS [quit: BOOLEAN _ FALSE]; [] _ SymTab.Store[ports, netONode.oNode.name, NEW[PortRep _ [name: netONode.oNode.name, eqClass: netONode.oNode.name, net: IPNetTab.FetchNet[netTab, netONode.net.name]]]]; }; --eachPort ports: SymTab.Ref _ SymTab.Create[]; IF structure.outerInstance # NIL THEN [] _ CoreRouteFlatProcs.EnumerateNetONodes[structure.outerInstance, EachPort]; RETURN [NEW[Rep _ [ports]]]; }; --CreateFromStructure FetchPort: PUBLIC PROC[portTab: Ref, name: Rope.ROPE] RETURNS [Port] ={ found: BOOL; val: REF; [found, val] _ portTab.ports.Fetch[name]; IF found THEN RETURN [NARROW[val]] ELSE ERROR IP.Error[missingRegistration, Rope.Cat[name, " is not a port name"]]; }; --FetchPort Ports: PUBLIC PROC[portTab: Ref, action: EachPortAction] ={ p: SymTab.EachPairAction = {RETURN[action[NARROW[val]]]};--p [] _ portTab.ports.Pairs[p]; }; --Ports CheckSelf: PUBLIC PROC[portTab: Ref] ={NULL}; --CheckSelf DescribeSelf: PUBLIC PROC[portTab: Ref, stream: IO.STREAM] ={ eachPortAction: EachPortAction ={ stream.PutF["%g:\t%g %g ", IO.rope[port.name], IO.refAny[port.eqClass], IO.refAny[IPNetTab.NetName[port.net]]]; IF port.position = NIL THEN stream.PutF["()\n"] ELSE stream.PutF["(%g %g)\n", IO.int[port.position.x], IO.int[port.position.y]]; };--eachPortAction stream.PutF["\nBeginPortTab\n"]; stream.PutF["\n%g \t--Number of Ports\n", IO.int[portTab.ports.GetSize[]]]; Ports[portTab, eachPortAction]; stream.PutF["EndPortTab\n"]; }; --DescribeSelf ReconstructSelf: PUBLIC PROC[stream: IO.STREAM, netTab: IPNetTab.Ref] RETURNS [Ref] ={ ports: SymTab.Ref _ SymTab.Create[]; THROUGH [0..stream.GetInt) DO name: Rope.ROPE; port: REF IP.PortRep; [name, port] _ GetPort[stream, netTab]; [] _ ports.Store[name, port]; ENDLOOP; IF stream.GetAtom[] # $EndPortTab THEN ERROR; RETURN [NEW[Rep _ [ports]]]; }; --ReconstructSelf PaintPort: PUBLIC PROC [port: Port, context: Imager.Context, xOffset, yOffset, scaleFactor: REAL, stipple: CARDINAL, size: INT, showPortName: BOOL] ={ IF port.position # NIL THEN { --Cant paint port that is not active halfDim: REAL _ (scaleFactor * size) /2.0; coordX, coordY: REAL; [coordX, coordY] _ port.position^; coordX _ xOffset + (coordX * scaleFactor); coordY _ yOffset + (coordY * scaleFactor); IF stipple = IPConstants.White THEN { path: Imager.PathProc ~ { moveTo[[coordX - halfDim, coordY - halfDim]]; lineTo[[coordX + halfDim, coordY - halfDim]]; lineTo[[coordX + halfDim, coordY + halfDim]]; lineTo[[coordX - halfDim, coordY + halfDim]]; lineTo[[coordX - halfDim, coordY - halfDim]];}; Imager.MaskStroke[context, path];} ELSE { Imager.SetGray[context, stipple]; Imager.MaskBox[context, [coordX - halfDim, coordY - halfDim, coordX + halfDim, coordY + halfDim]];}; IF showPortName THEN { Imager.SetXY[context, [coordX, coordY + (1.25 * halfDim)]]; Imager.ShowRope[context, port.name]}; }; };--PaintPort GetPort: PROC[stream: IO.STREAM, netTab: IPNetTab.Ref] RETURNS [Rope.ROPE, REF IP.PortRep] ={ name: Rope.ROPE _ TB.GetIdRope[stream]; -- First get the name eqClass: Rope.ROPE _ NARROW[IO.GetRefAny[stream]]; net: REF IP.NetRep _ IPNetTab.FetchNet[netTab, NARROW[IO.GetRefAny[stream]]]; position: REF IP.IntVector _ TB.GetIntVector[stream]; RETURN[name, NEW[IP.PortRep _ [name, eqClass, net, position]]]; }; --GetPort END. <--File: IPPortTabImpl.mesa Last Edited by: CSChow, January 18, 1985 3:19:53 pm PST Preas, August 2, 1986 0:01:46 am PDT changed definition for PaintPort November 30, 1987 2:55:20 pm PST Preas: April 10, 1988 4:52:41 pm PDT added CoreRouteFlat --(1) Print : --(2) Print port positon Κ˜J™™7Icode™$KšœΟn œ!™AK™8—J™J™šΟk ˜ K˜K˜KšœžœD˜PKšžœ˜Kšžœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ K˜Kšœ˜—K˜š œžœžœ˜Kšžœžœžœ!˜YKš žœ žœžœžœ žœ˜HK˜K˜š œžœžœ žœžœ ˜MKšœ$˜$šœ žœ˜KšœžœY˜sKšœΟc ˜ —Kšœ˜Kšžœžœ˜KšœŸ˜ —K˜šœžœžœ;žœ ˜lšœ*˜2Kš œžœFžœžœžœ˜mK˜Kšœ.žœz˜«KšœŸ ˜ —K˜Kšœ$˜$šžœžœž˜%KšœN˜N—Kšžœžœ˜KšœŸ˜K˜—š  œžœžœžœžœ ˜GKšœžœ˜ Kšœžœ˜ Kšœ)˜)šžœ˜ Kšžœžœžœ˜KšžœžœžœC˜P—KšœŸ ˜—K˜šœžœžœ)˜;Kšœžœžœ Ÿ˜Kšœžœžœžœ˜2Kš œžœžœ$žœžœ˜MKšœ žœžœ žœ˜5Kšžœžœžœ,˜?KšœŸ ˜ —K˜Kšžœ˜——…—Όy