<> <> <> <<>> DIRECTORY CD, CDCells, CDSymbolicObjects, CMos, IntStorageDefs, IO, ReadCif, ReadCifUserCmd, Rope; InsertChipwichPins: CEDAR PROGRAM IMPORTS CDCells, CDSymbolicObjects, CMos, IO, ReadCif, Rope EXPORTS ReadCifUserCmd = BEGIN ParseUserCmd: PUBLIC PROC [userCmd: IntStorageDefs.UserCmd, cell: CD.Object, design: CD.Design, reportError: ReadCifUserCmd.ReportErrorProc] = { userCmdText: Rope.ROPE _ NARROW[userCmd.data]; text: IO.STREAM _ IO.RIS[userCmdText]; pinName, layer: Rope.ROPE _ NIL; center: CD.Position _ [0, 0]; pinOb: CD.Object _ NIL; pinInst: CD.Instance _ NIL; width, height: CARDINAL; adjust: INT = 4; vertAdjust, horizAdjust: INT; cdLayer: CD.Layer _ CMos.met2; MyBreakProc: IO.BreakProc = { RETURN[SELECT char FROM IN [IO.NUL .. IO.SP], ',, ':, '; => sepr, '[, '], '(, '), '{, '}, '", '+, '*, '/, '@ => break, ENDCASE => other]}; FixPinName: PROC RETURNS [name: Rope.ROPE] = { ros: IO.STREAM _ IO.ROS[]; ris: IO.STREAM _ IO.RIS[pinName]; char: CHARACTER; IF Rope.Equal[pinName, "VDD", FALSE] THEN RETURN["Vdd"]; IF Rope.Equal[pinName, "GND", FALSE] THEN RETURN["Gnd"]; WHILE NOT ris.EndOf[] DO SELECT char _ IO.GetChar[ris] FROM IN ['a..'z], IN ['A..'Z], IN ['0..'9] => ros.PutChar[char]; ENDCASE => ros.PutChar['X]; ENDLOOP; RETURN[ros.RopeFromROS]; }; IF IO.GetChar[text] # '4 THEN { reportError[IO.PutFR["UserCmd %g not defined", IO.int[userCmd.command]], Warning]; RETURN}; pinName _ IO.GetTokenRope[text, MyBreakProc].token; center.x _ IO.GetInt[text]; center.y _ IO.GetInt[text]; layer _ IO.GetID[text]; SELECT TRUE FROM Rope.Equal[layer, "C62"] => { width _ height _ 8; cdLayer _ CMos.met2; horizAdjust _ -width/2; vertAdjust _ IF center.y < 0 THEN adjust ELSE -(adjust+height)}; Rope.Equal[layer, "C61"] => { -- Vdd and Gnd width _ 4; height _ 20; cdLayer _ CMos.met; horizAdjust _ IF center.x < 0 THEN adjust+3 ELSE - (adjust+width+1); vertAdjust _ -height/2}; ENDCASE => RETURN; pinName _ FixPinName[]; pinOb _ CDSymbolicObjects.CreatePin[[width, height]]; pinInst _ CDCells.IncludeOb[ design: IF cell = NIL THEN design ELSE NIL, cell: cell, ob: pinOb, position: [center.x/ReadCif.cifUnitsPerLambda+horizAdjust, center.y/ReadCif.cifUnitsPerLambda+vertAdjust], orientation: 0, cellCSystem: originCoords, obCSystem: interrestCoords, mode: dontPropagate].newInst; CDSymbolicObjects.SetName[pinInst, pinName]; CDSymbolicObjects.SetLayer[pinInst, cdLayer]; }; END.