<> <> <> <> 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 = { sizeOfFirstX: INT = TokenIO.ReadInt[h]; sizeOfFirstY: INT = TokenIO.ReadInt[h]; lev: CD.Layer = CDIO.ReadLayer[h]; count: INT = TokenIO.ReadInt[h]; offsetX: INT = TokenIO.ReadInt[h]; offsetY: INT = TokenIO.ReadInt[h]; lengIncrement: INT = TokenIO.ReadInt[h]; RETURN [ CreateBusCell[ design: CDIO.DesignInReadOperation[h], sizeOfFirst: [sizeOfFirstX, sizeOfFirstY], lev: lev, count: count, offset: [offsetX, offsetY], lengIncrement: lengIncrement ]]; }; <<--========================================================>> CreateBusCell: PUBLIC PROC [design: CD.Design, sizeOfFirst: CD.Position, lev: CD.Layer, count: NAT, offset: CD.Position, lengIncrement: CD.Number_0] RETURNS [CD.Object] = { 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, trans: [pos, original], mode: dontResize]; ENDLOOP; [] _ CDCells.SetInterestRect[NIL, co,, dontResize]; [] _ CDCells.ResizeCell[NIL, co]; IF design#NIL THEN [] _ CDDirectory.Include[design, co, "-bus-"]; RETURN [co]; }; [] _ CD.RegisterObjectClass[$Bus, [internalRead: ReadBus]]; END.