<> <> <> <> DIRECTORY CD, CDBasics, CDBusCells, CDCells, CDDirectory, CDIO, CDRects, TokenIO; CDBusCellsImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDCells, CDDirectory, CDIO, CDRects, TokenIO EXPORTS CDBusCells = BEGIN <<--========================================================>> <<--for compatibility only>> ReadBus: CD.InternalReadProc --PROC [] RETURNS [Object]-- = 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; <<--========================================================>> CreateBusCell: PUBLIC PROC [design: CD.Design, sizeOfFirst: CD.Position, lev: CD.Layer, count: NAT, offset: CD.Position, lengIncrement: CD.Number_0] RETURNS [CD.Object] = BEGIN sz: CD.Position _ sizeOfFirst; pos: CD.Position _ [0, 0]; co: CD.Object _ CDCells.CreateEmptyCell[]; count _ MAX[count, 1]; IF sz.x<=0 THEN sz.x_1; IF sz.y<=0 THEN sz.y_1; 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.Object _ CDRects.CreateRect[sz, lev]; pos _ CDBasics.AddPoints[pos, offset]; sz.y _ sz.y+lengIncrement; [] _ CDCells.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; [] _ CD.RegisterObjectClass[$Bus, [internalRead: ReadBus]]; END.