DIRECTORY IO, FS, SymTab, Atom, Rope, ReadConnection, TerminalIO, CD, CDIO, CDPins, CDDirectory, CDInterestRects, IP, IPBasicOps, IPTypeDict, IPToolBox, IPChipRose; IPChipRoseImpl: CEDAR PROGRAM IMPORTS IO, FS, SymTab, Atom, Rope, TerminalIO, CDIO, CDPins, CDDirectory, CDInterestRects, ReadConnection, IP, IPBasicOps, IPToolBox, IPTypeDict EXPORTS IPChipRose = BEGIN OPEN RC: ReadConnection, BO: IPBasicOps, TD: IPTypeDict, TB: IPToolBox, IPChipRose; NameConflict: PUBLIC ERROR [name: Rope.ROPE, in: Which] = CODE; UnDeclared: PUBLIC ERROR[name: Rope.ROPE, in: Which] = CODE; CreateFrom: PUBLIC PROC[roseFile, chipFile, typFile, initFile: Rope.ROPE _ NIL, chipBeforeTyp, debug: BOOL] RETURNS [Ref] ={ r: Ref _ NEW[Rep _ [nets: SymTab.Create[], ports: SymTab.Create[], instances: SymTab.Create[], types: SymTab.Create[]]]; cdDesign: CD.Design _ IF chipFile = NIL THEN NIL ELSE CDIO.ReadDesign[chipFile]; ipTypDict: TD.Ref _ IF typFile = NIL THEN NIL ELSE TD.Create[typFile]; headerProc: ReadConnection.EnumHeaderProc = { IF Rope.Equal[key, "CellTypeName"] THEN r.cellTypeName _ val1}; --headerProc-- portsProc: ReadConnection.EnumPortsProc = { WHILE portList # NIL DO IF ~ r.ports.Insert[portList.first.portName, NEW[PortRec _ [portList.first.ecName, NIL, portList.first.portDir]]] THEN ERROR IP.Error[doubleRegistration, portList.first.portName]; portList _ portList.rest ENDLOOP; };--portsProc-- netProc: ReadConnection.EnumNetsProc= { IF ~ r.nets.Insert[netName, NEW[NetRec _ [generation]]] THEN ERROR IP.Error[doubleRegistration, netName]; };--netProc-- portNetProc: ReadConnection.EnumPortNetsProc= { found: BOOL; val: REF; port: REF PortRec; [found, val] _ r.ports.Fetch[portName]; IF ~ found THEN ERROR IP.Error[missingRegistration, portName]; port _ NARROW[val]; port.net _ netName; };--portNet-- instanceProc: ReadConnection.EnumCompsProc = { pinNets: LIST OF PinNetRec _ NIL; instType: REF TypeRec; WHILE pinNetList # NIL DO pN: RC.pinNet _ pinNetList.first; pinNets _ CONS[PinNetRec[pN.pinName, pN.netName], pinNets]; pinNetList _ pinNetList.rest; ENDLOOP; IF ~ r.instances.Insert[instName, NEW[InstanceRec _ [typeName, pinNets]]] THEN ERROR IP.Error[doubleRegistration, instName]; BEGIN found: BOOL _ FALSE; val: REF; cdObj: CD.ObPtr; ipType: REF TD.TypeEntryRep; [found, val] _ r.types.Fetch[typeName]; IF found THEN { instType _ NARROW[val]; instType.instances _ CONS[instName, instType.instances]; RETURN --Done }; --endIF IF chipBeforeTyp THEN { IF cdDesign # NIL THEN [found, cdObj]_ CDDirectory.Fetch[cdDesign, typeName]; IF found THEN { CDPins.CleanUpPins[cdDesign, cdObj]; instType _ FromCDType[cdObj, instName]; GOTO insert; }; --endIF IF ipTypDict # NIL THEN [found, ipType] _ ipTypDict.LookUp[typeName]; IF found THEN { instType _ FromIPType[ipType, instName]; GOTO insert; }; --endIF } ELSE { IF ipTypDict # NIL THEN [found, ipType] _ ipTypDict.LookUp[typeName]; IF found THEN { instType _ FromIPType[ipType, instName]; GOTO insert; }; --endIF IF cdDesign #NIL THEN [found, cdObj] _ CDDirectory.Fetch[cdDesign, typeName]; IF found THEN { CDPins.CleanUpPins[cdDesign, cdObj]; instType _ FromCDType[cdObj, instName]; GOTO insert; }; --endIF }; --endIF TerminalIO.WriteRope[Rope.Cat[typeName, " is undefined\n"]] EXITS insert => [] _ r.types.Insert[typeName, instType]; END; };--instanceProc-- IF debug THEN { eachTypAction: IPTypeDict.EachTypeEntryAction ={ [] _ r.types.Insert[type, FromIPType[entry]] }; --eachTypAction eachCDObjAction: CDDirectory.EachEntryAction ={ CDPins.CleanUpPins[cdDesign, ob]; [] _ r.types.Insert[name, FromCDType[ob]] }; --eachCDObjAction IF chipBeforeTyp THEN { IF cdDesign # NIL THEN [] _ CDDirectory.Enumerate[cdDesign, eachCDObjAction]; IF ipTypDict # NIL THEN [] _ IPTypeDict.TypeEntries[ipTypDict, eachTypAction]; } ELSE { IF ipTypDict # NIL THEN [] _ IPTypeDict.TypeEntries[ipTypDict, eachTypAction]; IF cdDesign # NIL THEN [] _ CDDirectory.Enumerate[cdDesign, eachCDObjAction]; }; --endIF }; --endIF RC.ReadConct[roseFile, headerProc, portsProc, netProc, portNetProc, instanceProc]; IF initFile # NIL THEN { stream: IO.STREAM _ FS.StreamOpen[initFile]; DO ENABLE IO.EndOfStream => EXIT; token: ATOM _ TB.GetIdAtom[stream]; SELECT token FROM $initialPlacement => GetInitialPlacement[r.instances, stream] ENDCASE => { TerminalIO.WriteRope[Rope.Cat["Unknown Token: ", Atom.GetPName[token]]]; TB.RemoveBlock[stream]; TerminalIO.WriteRope["\n\t Associated block is ignored"]; }; ENDLOOP; }; --endIF RETURN [r] }; --CreateFrom-- Fetch: PUBLIC PROC[r: Ref, name: Rope.ROPE, what: Which] RETURNS [val: REF] ={ found: BOOL; whatTable: SymTab.Ref _ SELECT what FROM net => r.nets, port => r.ports, type => r.types, instance => r.instances, ENDCASE => ERROR; [found, val] _ whatTable.Fetch[name]; IF found THEN RETURN [val] ELSE ERROR IP.Error[missingRegistration, name]; }; --Fetch-- Nets: PUBLIC PROC[r: Ref, action: EachNetAction] ={ netProc: SymTab.EachPairAction = { RETURN [action[key, NARROW[val]]]}; --netProc-- [] _ r.nets.Pairs[netProc]; }; --Nets-- Ports: PUBLIC PROC[r: Ref, action: EachPortAction] ={ portProc: SymTab.EachPairAction = { RETURN [action[key, NARROW[val]]]}; --portProc-- [] _ r.ports.Pairs[portProc]; }; --Ports-- Types: PUBLIC PROC [r: Ref, action: EachTypeAction] ={ typeProc: SymTab.EachPairAction = { RETURN [action[key, NARROW[val]]]}; --typeProc-- [] _ r.types.Pairs[typeProc]; }; --Types-- Instances: PUBLIC PROC[r: Ref, action: EachInstanceAction] ={ instanceProc: SymTab.EachPairAction = { RETURN [action[key, NARROW[val]]]}; --instanceProc-- [] _ r.instances.Pairs[instanceProc]; }; --Instances-- FromCDType: PROC[cdObj: CD.ObPtr, firstInst: Rope.ROPE _ NIL] RETURNS [REF TypeRec] ={ shape: REF ShapeRep; pins: LIST OF REF IP.PinRep _ TB.IPPinsFromCDPins[CDPins.GetPins[cdObj]]; cdRect: CD.DesignRect _ CDInterestRects.GetInterestRect[cdObj].r; origin: IP.IntVector _ [cdRect.x1, cdRect.y1]; width: NAT _ cdRect.x2 - cdRect.x1; height: NAT _ cdRect.y2 - cdRect.y1; instances: LIST OF Rope.ROPE _ IF firstInst = NIL THEN NIL ELSE LIST[firstInst]; shape _ NEW[ShapeRep _ [BO.NuNatVector [width, height]]]; RETURN [NEW[TypeRec _ [origin, instances, pins, shape]]] }; --FromCDType-- FromIPType: PROC [ipType: REF TD.TypeEntryRep, firstInst: Rope.ROPE _ NIL] RETURNS [REF TypeRec] = { instances: LIST OF Rope.ROPE _ IF firstInst = NIL THEN NIL ELSE LIST[firstInst]; RETURN [NEW[TypeRec _[ipType.origin, instances, ipType.pins, ipType.shape, ipType.shapeFn, ipType.restriction]]] }; --FromIPType GetInitialPlacement: PROC[instances: SymTab.Ref, stream: IO.STREAM] ={ found: BOOL; val: REF; TB.EnterBlock[stream]; UNTIL TB.ExitBlock[stream] DO instName: Rope.ROPE _ TB.GetIdRope[stream]; [found, val] _ instances.Fetch[instName]; IF found THEN { TB.EnterBlock[stream]; UNTIL TB.ExitBlock[stream] DO token: ATOM _ TB.GetIdAtom[stream]; SELECT token FROM $origin => NARROW[val, REF InstanceRec].origin _ TB.GetIntVector[stream]; $orient => NARROW[val, REF InstanceRec].orient _ stream.GetInt; ENDCASE => { TerminalIO.WriteRope[Rope.Cat["Unknown token: ", Atom.GetPName[token], ". associated value ignored"]]; [] _ stream.GetRefAny; }; ENDLOOP; } ELSE { TerminalIO.WriteRope[Rope.Cat[instName, " _ Unknown instance. Block is ignored\n"]]; TB.RemoveBlock[stream] }; ENDLOOP; }; --GetInitialPlacement END. ά--File: IPChipRoseImpl.mesa Last Edited by: CSChow, January 22, 1985 5:41:21 pm PST -- NB: This can only be used once (see FromIPType) -- otherwise there may be confusions in the -- TD.TypeEntryRep.shape and TD.TypeEntryRep.pins --These are procedures to build up entries in symTabs of r-- --(1) This is simply to get the name of the assembly, other headers are ignored --(2) --(3) --(4) --(5) --(A) Read in all type definitions into r.types if debug = TRUE -- NB: precedence specified by chipBeforeTyp --(B) Read Connections: (i) roseFile (ii) chipFile and/or typeFile --(C) Read initFile, that is the initial placement of components --Now only determine width and height of cdObj. Dimension of corners may come later Κ ―˜J™J™7J™šΟk ˜ Jšœ˜Jšœ˜Jšœ˜J˜Jšœ˜Jšœ˜J˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ ˜ J˜—šœœœ˜Jš œœœ"œ8œ#˜‘Jšœœœœœœœ˜nJ˜Icodeš œœœ œœ˜?Jš œ œœ œœ˜ -- [netName: ROPE, generation: ReadConnection.Generation] -- ˜K™šœ'˜'šœœ˜8Kšœœœ$˜1—KšœŸ œ˜ —K–' -- [portName: ROPE, netName: ROPE] -- ˜K™šœ/˜/Kšœœ˜ Kšœœ˜ Kšœœ ˜Kšœ'˜'Kšœ œœ)˜>Kšœœ˜Kšœ˜KšœŸ œ˜ —K–S -- [instName: ROPE, typeName: ROPE, pinNetList: LIST OF ReadConnection.pinNet] -- ˜K™šœ.˜.Kšœ œœ œ˜!Kšœ œ ˜šœœ˜Kšœœ˜!Kšœ œ-˜;Kšœ˜Kšœ˜—šœ œ%˜JKšœœ(˜2—K˜š˜Kšœ œ˜Kšœœ˜ Kšœœ˜Kšœœœ˜K˜Kšœ'˜'šœœ˜Kšœ œ˜Kšœœ˜8KšœŸ˜KšœŸ˜ —K˜šœ˜šœ˜Kšœ œœ7˜Mšœœ˜Kšœ$˜$Kšœ'˜'Kšœ˜ KšœŸ˜ —K˜Kšœ œ.˜Ešœœ˜Kšœ(˜(Kšœ˜ KšœŸ˜ —Kšœ˜—šœ˜K˜Kšœ œ.˜Ešœœ˜Kšœ(˜(Kšœ˜ KšœŸ˜ —K˜Kšœ œ8˜Mšœœ˜Kšœ$˜$Kšœ'˜'Kšœ˜ KšœŸ˜ —K˜KšœŸ˜ ——K˜;š˜Kšœ2˜2—Kšœ˜K˜—KšœŸœ˜—K˜KšŸ?™?Kšœ,™,šœœ˜šœ0˜0Kšœ,˜,KšœŸ˜—šœ/˜/Kšœ!˜!Kšœ)˜)KšœŸ˜—šœ˜šœ˜Kšœ œ7˜MKšœ œ7˜NKšœ˜—šœ˜Kšœ œ7˜NKšœ œ7˜MKšœŸ˜ ——KšœŸ˜ —K˜K™CšœP˜RK˜—K˜K™@šœ œœ˜Kšœœœœ˜,š˜Kšœœœ˜Kšœœœ˜#šœ˜Kšœ=˜=šœ˜ KšœH˜HKšœ˜Kšœ9˜9Kšœ˜——K˜Kšœ˜—KšœŸ˜ —K˜Kšœ˜ KšœŸ˜—K˜š žœœœœœœ˜NKšœœ˜ šœœœ˜)Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœœ˜—Kšœ%˜%šœ˜ Kšœœ˜Kšœœ%˜/—KšœŸœ˜ —K˜šžœœœ"˜3šœ"˜"Kšœœ Ÿ ˜/—Kšœ˜KšœŸœ˜ —šžœœœ#˜5šœ#˜#Jšœœ Ÿ ˜0—Kšœ˜JšœŸœ˜ —šžœœœ$˜6šœ#˜#Kšœœ Ÿ ˜0—Kšœ˜JšœŸœ˜ —šž œœœ'˜=šœ'˜'Kšœœ Ÿ˜4—Kšœ%˜%KšœŸ œ˜—K˜šž œœœœœœœ ˜VKšœœ ˜Kš œœœœœ œ)˜IKšœœ7˜AKšœœ$˜.Kšœœ˜#Kšœœ˜$K–[]š œ œœ œ œ ˜PK™KšŸS™SKšœœ œ ˜:Kšœœ-˜8KšœŸ œ˜—K˜šž œœ œœœœœœ ˜dKš œ œœ œ œ ˜PKšœœe˜pKšœŸ ˜—K˜šžœœ œœ˜FKšœœ˜ Kšœœ˜ K˜Kšœ˜šœœ˜Kšœœœ˜+Kšœ)˜)šœ˜ šœ˜Kšœ˜šœ˜Kšœœœ˜#šœ˜Kšœ œœœ˜IKšœ œœ%˜?šœ˜ Kšœf˜fK˜Kšœ˜——Kš˜—Kšœ˜—šœ˜KšœT˜TKšœ˜Kšœ˜——Kšœ˜—K˜KšœŸ˜—Kšœ˜J˜——…—’+-