DIRECTORY CDBusses, CD, CDBasics, CDIO, CDOrient, CDCallSpecific, CDCells, CDOps, CDDirectory, CDProperties, CDRects, CDApplications, TerminalIO, TokenIO; CDBussesImpl: CEDAR PROGRAM IMPORTS CD, CDApplications, CDBasics, CDCallSpecific, CDCells, CDDirectory, CDIO, CDOrient, CDOps, CDProperties, CDRects, TerminalIO, TokenIO EXPORTS CDBusses = BEGIN BusPtr: TYPE = CDBusses.BusPtr; BusRec: TYPE = CDBusses.BusRec; CreateBus: PUBLIC PROC [sizeOfFirst: CD.DesignPosition, lev: CD.Layer, count: NAT, offset: CD.DesignPosition, lengIncrement: CD.DesignNumber_0] RETURNS [CD.ObPtr] = BEGIN ob: CD.ObPtr; bp: BusPtr ~ NEW[BusRec]; lowY, highY, left, right: CD.DesignNumber; IF CDProperties.GetPropFromLayer[from: lev, prop: $CDxRectCreation]#NIL THEN { TerminalIO.WriteRope["busses on layer "]; TerminalIO.WriteRope[CDOps.LayerName[lev]]; TerminalIO.WriteRope[" not implemented\n"]; RETURN [CDRects.CreateRect[size: sizeOfFirst, l: lev]] }; count _ MAX[1, MIN[count, 512]]; IF sizeOfFirst.y<=0 THEN sizeOfFirst.y_CD.lambda; IF sizeOfFirst.x<=0 THEN sizeOfFirst.x_CD.lambda; IF sizeOfFirst.y+(count-1)*lengIncrement<=0 THEN lengIncrement_0; lowY _ MIN[0, (count-1)*offset.y]; highY _ MAX[sizeOfFirst.y, (count-1)*(offset.y+lengIncrement)+sizeOfFirst.y]; left _ MIN[0, (count-1)*offset.x]; right _ MAX[sizeOfFirst.x, (count-1)*(offset.x)+sizeOfFirst.x]; ob _ NEW[CD.ObjectDefinition _ [ p: pForBusses, size: [x: right-left, y: highY-lowY], layer: lev, specificRef: bp ]]; bp.sizeOfFirst _ sizeOfFirst; bp.offsetOfFirst _ [-left, -lowY]; bp.offset _ offset; bp.count _ count; bp.lengIncrement _ lengIncrement; RETURN [ob] END; 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 [ CreateBus[ sizeOfFirst: [sizeOfFirstX, sizeOfFirstY], lev: lev, count: count, offset: [offsetX, offsetY], lengIncrement: lengIncrement ]]; END; WriteBus: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN bp: BusPtr = NARROW[me.specificRef]; TokenIO.WriteInt[bp.sizeOfFirst.x]; TokenIO.WriteInt[bp.sizeOfFirst.y]; CDIO.WriteLayer[me.layer]; TokenIO.WriteInt[bp.count]; TokenIO.WriteInt[bp.offset.x]; TokenIO.WriteInt[bp.offset.y]; TokenIO.WriteInt[bp.lengIncrement]; END; pForBusses: REF CD.ObjectProcs; TransformToCell: CDCallSpecific.CallProc = BEGIN bptr: BusPtr_NARROW[aptr.ob.specificRef]; cob: CD.ObPtr _ CreateBusCell[design: design, sizeOfFirst: bptr.sizeOfFirst, lev: aptr.ob.layer, count: bptr.count, offset: bptr.offset, lengIncrement: bptr.lengIncrement ]; removeMe_TRUE; repaintMe_TRUE; include_LIST[CDApplications.NewApplicationI[ cob, aptr.location, aptr.orientation, aptr.selected, aptr.properties]]; repaintInclude_TRUE; END; Init: PROC [] = BEGIN pForBusses _ CD.RegisterObjectType[$Bus]; pForBusses.objectType _ $Bus; pForBusses.drawMe _ DrawMeForBus; pForBusses.internalRead _ ReadBus; pForBusses.internalWrite _ WriteBus; CDCallSpecific.Register[$TransformToCell, pForBusses, TransformToCell]; END; DrawMeForBus: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN bp: BusPtr _ NARROW[aptr.ob.specificRef]; rel, sz: CD.DesignPosition; rel _ bp.offsetOfFirst; sz _ bp.sizeOfFirst; THROUGH [0..bp.count) DO IF pr.stopFlag^ THEN EXIT; pr.drawRect[ CDOrient.MapRect[ itemInCell: CDBasics.RectAt[rel, sz], cellSize: aptr.ob.size, cellInstOrient: orient, cellInstPos: pos], aptr.ob.layer, pr]; rel _ CDBasics.AddPoints[rel, bp.offset]; sz.y _ sz.y+bp.lengIncrement; ENDLOOP 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; ap: CD.ApplicationPtr; pos: CD.DesignPosition _ [0, 0]; co: CD.ObPtr _ CDCells.CreateEmptyCell[]; cp: CD.CellPtr _ NARROW[co.specificRef]; IF CDProperties.GetPropFromLayer[from: lev, prop: $CDxRectCreation]#NIL THEN { TerminalIO.WriteRope["busses on layer "]; TerminalIO.WriteRope[CDOps.LayerName[lev]]; TerminalIO.WriteRope[" not implemented\n"]; RETURN [CDRects.CreateRect[size: sizeOfFirst, l: lev]] }; 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]; ap _ CDApplications.NewApplicationI[ob: rec, location: pos]; pos _ CDBasics.AddPoints[pos, offset]; sz.y _ sz.y+lengIncrement; cp.contents _ CONS[ap, cp.contents] ENDLOOP; co.size _ CDBasics.SizeOfRect[CDApplications.BoundingRectO[cp.contents]]; [] _ CDDirectory.Include[design, co, "-bus-"]; RETURN [co]; END; Init[]; END. CDBussesImpl.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, June 24, 1983 4:58 pm last edited Christian Jacobi, April 11, 1985 9:20:14 am PST --tests for legality of layer and numbers --real creation ÊD˜šœ'™'Jšœ Ïmœ7™BJšœ+™+Jšœ;™;—J˜šÏk ˜ J˜ Jšžœ˜J˜ Jšžœ˜Jšœ ˜ J˜J˜J˜J˜ J˜ J˜J˜Jšœ ˜ Jšœ˜J˜—šÏb œžœžœ˜JšžœžœBžœ=˜Jšžœ ˜—Jšž˜J˜Jšœžœ˜Jšœžœ˜J˜šÏn œžœžœžœžœžœ žœ˜nJšœžœžœžœ ˜6Jšž˜Jšœžœ˜ Jšœ žœ ˜Jšœžœ˜*Jšœ)™)šžœBžœžœ˜NJ˜)Jšœ+˜+Jšœ+˜+Jšžœ0˜6J˜—Jšœžœžœ˜ Jšžœžœžœ˜1Jšžœžœžœ˜1Jšžœ*žœ˜AJšœ™Jšœžœ˜"JšœžœB˜MJšœžœ˜"Jšœžœ4˜?šœžœžœ˜ Jšœ˜J˜%J˜ J˜Jšœ˜—J˜Jšœ"˜"J˜J˜Jšœ!˜!Jšžœ˜ Jšžœ˜J˜—šŸœžœÏcœ˜:Jšž˜Jšœžœ˜&Jšœžœ˜&Jšœžœ žœ ˜!Jšœžœ˜Jšœ žœ˜!Jšœ žœ˜!Jšœžœ˜'šžœ ˜Jšœ+˜+Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜—Jšžœ˜—J˜šŸœžœ¡œ˜7Jšž˜Jšœ žœ˜$Jšœ#˜#Jšœ#˜#Jšžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ#˜#Jšžœ˜—J˜Jšœ žœ ˜J˜šŸœ˜*Jšž˜Jšœ žœ˜)šœžœ'˜.Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ!˜!Jšœ˜—Jšœ žœ˜Jšœ žœ˜šœžœ ˜,JšœG˜G—Jšœžœ˜Jšžœ˜—š œžœ˜Jšž˜Jšœ žœ˜)J˜J˜!Jšœ"˜"Jšœ$˜$JšœG˜GJšžœ˜J˜—š   œžœžœžœžœ ˜\Jšœžœ ˜Jšž˜Jšœ žœ˜)Jšœ žœ˜Jšœ˜J˜šžœž˜Jšžœžœžœ˜˜˜J˜'Jšœ˜J˜J˜—Jšœ˜J˜—J˜)Jšœ˜Jšž˜—Jšžœ˜—J˜š  œžœžœ žœžœžœžœ žœ žœžœžœ ˜»Jšž˜Jšœžœ˜"Jšœžœ˜Jšœžœ˜ Jšœžœ#˜)Jšœžœ žœ˜(šžœBžœžœ˜NJ˜)Jšœ+˜+Jšœ+˜+Jšžœ0˜6J˜—Jšœžœ ˜Jšžœ žœžœ˜Jšžœ žœžœ˜Jšžœ žœ˜7Jšžœ žœ˜1Jšžœ žœ˜1šžœžœžœ ž˜Jšœžœ%˜,Jšœ<˜