<> <> <> <> DIRECTORY CD, CDBasics, CDBusCells, CDCells, CDDirectory, CDIO, CDRects, CDX, TokenIO; CDBusCellsImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCells, CDDirectory, CDIO, CDRects, CDX, TokenIO EXPORTS CDBusCells = BEGIN <<--========================================================>> <<--for compatibility only>> ReadBus: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN sizeOfFirstX: INT = TokenIO.ReadInt[]; sizeOfFirstY: INT = TokenIO.ReadInt[]; lev: CD.Layer = CDIO.ReadLayer[]; count: INT = TokenIO.ReadInt[]; offsetX: INT = TokenIO.ReadInt[]; offsetY: INT = TokenIO.ReadInt[]; lengIncrement: INT = TokenIO.ReadInt[]; RETURN [ CreateBusCell[ design: CDIO.DesignInReadOperation[], sizeOfFirst: [sizeOfFirstX, sizeOfFirstY], lev: lev, count: count, offset: [offsetX, offsetY], lengIncrement: lengIncrement ]]; END; pForBusses: REF CD.ObjectProcs; Init: PROC [] = BEGIN pForBusses _ CD.RegisterObjectType[$Bus]; pForBusses.internalRead _ ReadBus; END; <<--========================================================>> CreateBusCell: PUBLIC PROC [design: CD.Design, sizeOfFirst: CD.DesignPosition, lev: CD.Layer, count: NAT, offset: CD.DesignPosition, lengIncrement: CD.DesignNumber_0] RETURNS [CD.ObPtr] = BEGIN sz: CD.DesignPosition _ sizeOfFirst; pos: CD.DesignPosition _ [0, 0]; co: CD.ObPtr _ CDCells.CreateEmptyCell[]; count _ MAX[count, 1]; IF sz.x<=0 THEN sz.x_CD.lambda; IF sz.y<=0 THEN sz.y_CD.lambda; IF sz.y+(count-1)*lengIncrement<0 THEN lengIncrement_0; IF offset.x<0 THEN {pos.x _ -offset.x*(count-1)}; IF offset.y<0 THEN {pos.y _ -offset.y*(count-1)}; FOR i: NAT IN [1..count] DO rec: CD.ObPtr _ CDRects.CreateRect[sz, lev]; pos _ CDBasics.AddPoints[pos, offset]; sz.y _ sz.y+lengIncrement; [] _ CDX.IncludeOb[design: NIL, cell: co, ob: rec, position: pos, cellCSystem: originCoords, obCSystem: interrestCoords, mode: dontPropagate ]; ENDLOOP; [] _ CDCells.RepositionCell[co, NIL]; IF design#NIL THEN [] _ CDDirectory.Include[design, co, "-bus-"]; RETURN [co]; END; Init[]; END.