DIRECTORY CD, CDCommands, CDOps, CDOrient, CDRects, CDSequencer, TerminalIO, CDInline; WireAndSelectCommands: CEDAR PROGRAM IMPORTS CDCommands, CDOps, CDSequencer, TerminalIO, CDRects, CDInline = BEGIN AddARect: PROC[design: CD.Design, r: CD.DesignRect, l: CD.Level] = BEGIN ob: CD.ObPtr; sz: CD.DesignPosition _ CDInline.SizeOfRect[r]; orient: CD.Orientation _ CDOrient.original; IF sz.y=start.x-wireWidth AND (stop.ystart.y+wireWidth) THEN { --crazy vertical wire IF ABS[start.y-stop.y]=start.y AND stop.y<=start.y+wireWidth THEN { --horizontal wire stop.y _ start.y+wireWidth; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l] } ELSE { --L shaped (firsthorizontal) IF start.x<=stop.x THEN {stop.x _ stop.x+wireWidth} ELSE {t: CD.Number=stop.x; stop.x _ start.x; start.x _ t}; stop.y _ start.y+wireWidth; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l]; IF firstOnly THEN RETURN; start.x _ comm.pos.x; stop.y _ comm.pos.y; stop.x _ start.x+wireWidth; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l]; } } ELSE { -- NOT firstHorizontalVC -- IF stop.y<=start.y AND stop.y>=start.y-wireWidth AND (stop.xstart.x+wireWidth) THEN { --crazy horizontal wire IF ABS[stop.x-start.x]=start.x AND stop.x<=start.x+wireWidth THEN { --vertical wire stop.x _ start.x+wireWidth; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l] } ELSE { --L shaped (firstVertical) IF start.y<=stop.y THEN {stop.y _ stop.y+wireWidth} ELSE {t: CD.Number = stop.y; stop.y _ start.y; start.y _ t}; stop.x _ start.x+wireWidth; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l]; IF firstOnly THEN RETURN; start.y _ comm.pos.y; stop.y _ start.y+wireWidth; stop.x _ comm.pos.x; AddARect[comm.design, CDInline.ToRect[start, stop], comm.l]; } } END; DeselectPointed: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Remove selection\n"]; CDCommands.DeSelect[comm.design, comm.pos] END; AddSelection: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Add selection "]; CDCommands.Select[comm.design, comm.pos]; TerminalIO.WriteLn[]; END; DeselectAll: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Deselect all\n"]; CDCommands.DeselectAll[comm.design] END; DeleteSelected: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Delete selected\n"]; CDCommands.DeleteSelected[comm.design] END; DeletePointed: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Delete pointed\n"]; CDCommands.DeletePointed[comm.design, comm.pos] END; Undelete: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Undelete\n"]; CDCommands.Undelete[comm.design] END; SelectAll: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Select all\n"]; CDCommands.SelectAll[comm.design] END; AreaAddSelect: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Inclusive select area\n"]; CDCommands.AreaSelect[comm.design, CDInline.ToRect[comm.pos, comm.sPos]] END; AreaOnlySelect: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Exclusive select area\n"]; CDCommands.DeselectAll[comm.design]; CDCommands.AreaSelect[comm.design, CDInline.ToRect[comm.pos, comm.sPos]] END; AreaDeSelect: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["Deselect area\n"]; CDCommands.AreaDeSelect[comm.design, CDInline.ToRect[comm.pos, comm.sPos]] END; Impl: PROC [] = BEGIN CDSequencer.ImplementCommand[$OnlySelectP, SelectExclusive]; CDSequencer.ImplementCommand[$AddSelectP, AddSelection]; CDSequencer.ImplementCommand[$DeSelectP, DeselectPointed]; CDSequencer.ImplementCommand[$DeSelectS, DeselectAll]; CDSequencer.ImplementCommand[$DrawRect, AddRect]; CDSequencer.ImplementCommand[$DrawWire, AddWire]; CDSequencer.ImplementCommand[$ContinueWire, ContinueWire]; CDSequencer.ImplementCommand[$DeleteS, DeleteSelected]; CDSequencer.ImplementCommand[$DeleteP, DeletePointed]; CDSequencer.ImplementCommand[$SelectAll, SelectAll]; CDSequencer.ImplementCommand[$AreaOnlySelect, AreaOnlySelect]; CDSequencer.ImplementCommand[$AreaAddSelect, AreaAddSelect]; CDSequencer.ImplementCommand[$AreaDeSelect, AreaDeSelect]; CDSequencer.ImplementCommand[$Undel, Undelete]; END; Impl[]; END. €WireAndSelectCommands.mesa (part of Chipndale) by Christian Jacobi June 29, 1983 4:44 pm last edited Christian Jacobi February 3, 1984 7:19 pm --uses pos, sPos, n (for width), b (for firstHorizontal), l (for level) --this procedure knows EXACTLY the algorithm used for showing --temporary wires in the cursor part --not only crazy vertical -- not only crazy horizontal Êk˜Jšœ0™0Jšœ,™,Jšœ7™7J˜šÏk ˜ Jšœ˜J˜ J˜J˜ J˜J˜ J˜ J˜ J˜—šÏnœœ˜$JšœA˜H—Jš˜J˜š žœœ œ œœ ˜CJš˜Jšœœ˜ Jšœœ)˜/Jšœœ!˜+šœ œ˜Jšœœ˜Jšœ ˜ Jšœ ˜ Jšœ˜Jšœ˜—Jšœ œ7œ˜NJšœ˜˜J˜J˜J˜"Jšœ˜—Jšœ˜J˜—šžœœ˜3Jš˜J˜!J˜$J˜)J˜Jšœ˜J˜—šžœœ˜+Jš˜J˜$JšœD˜DJšœ˜—J˜šžœœ˜+JšœG™GJš˜Jšœ'œ˜-Jš˜—J˜šž œœ˜0Jš˜Jšœ'œ˜,Jšœ˜—J˜šžœœ(œœ˜JJšœ=™=Jšœ$™$Jš˜Jšœœ˜&Jšœœ˜#Jšœ œ˜$Jšœ œœ˜,J˜$šœÏcœœ˜$šœœ˜0JšœœœŸ˜Mšœœœœ˜&Jšœ2œ˜:—Jšœ˜Jšœ<˜˜>Jšœ<˜