DIRECTORY Rope, Graphics, IO, SymTab, IP, IPConstants, IPToolBox, IPChipRose, IPNetTab, IPPortTab; IPPortTabImpl: CEDAR PROGRAM IMPORTS IO, Graphics, 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 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: Graphics.Context, xOffset, yOffset, scaleFactor: REAL, stipple: CARDINAL, size: NAT, showPortName: BOOL] ={ IF port.position # NIL THEN { --Cant paint port that is not active path: Graphics.Path _ Graphics.NewPath[]; halfDim: REAL _ (scaleFactor * size) /2.0; coordX, coordY: REAL; [coordX, coordY] _ port.position^; coordX _ xOffset + (coordX * scaleFactor); coordY _ yOffset + (coordY * scaleFactor); Graphics.Rectangle[path, coordX - halfDim, coordY - halfDim, coordX + halfDim, coordY + halfDim]; IF stipple = IPConstants.White THEN Graphics.DrawStroke[self: context, path: path, closed: TRUE] ELSE { Graphics.SetStipple[context, stipple]; Graphics.DrawArea[context, path];}; IF showPortName THEN { Graphics.SetCP[context, coordX, coordY + (1.25 * halfDim)]; Graphics.DrawRope[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 --(1) Print : --(2) Print port positon ΚΊ˜J™J™7J™J™codešΟk ˜ K˜K˜ Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ —K˜šœœœ˜Kšœœœ!˜GKš œ œœœ œ˜HK˜K˜š Οnœœœ œœ ˜MKšœ$˜$šœ œ˜KšœœY˜sKšœΟc ˜ —Kšœ˜Kšœœ˜KšœŸ˜ —K˜š ž œœœœœ ˜GKšœœ˜ Kšœœ˜ Kšœ)˜)šœ˜ Kšœœœ˜KšœœœC˜P—KšœŸ ˜—K˜šžœœœ)˜;Kšœœœ Ÿ˜Kšœœœœ˜2Kš œœœ$œœ˜MKšœ œœ œ˜5Kšœœœ,˜?KšœŸ ˜ —K˜Kšœ˜——…— Z