CDBasicCommands.mesa (part of ChipNDale)
Copyright © 1983, 1985 by Xerox Corporation. All rights reserved.
by Christian Jacobi, June 29, 1983 4:44 pm
last edited Christian Jacobi, April 17, 1985 11:46:17 am PST
DIRECTORY
CD,
CDBasics,
CDSimpleOps,
CDOps,
CDOrient,
CDRects,
CDSequencer,
TerminalIO;
CDBasicCommands:
CEDAR
PROGRAM
IMPORTS CDSimpleOps, CDOps, CDSequencer, TerminalIO, CDRects, CDBasics =
BEGIN
AddARect:
PROC[design:
CD.Design, r:
CD.Rect, l:
CD.Layer] =
BEGIN
ob: CD.Object;
sz: CD.Position ← CDBasics.SizeOfRect[r];
orient: CD.Orientation ← CDOrient.original;
IF sz.y<sz.x
THEN {
w: CD.Number ← sz.x;
sz.x ← sz.y;
sz.y ← w;
orient ← CDOrient.rotate90
};
IF sz.x<=0 THEN {TerminalIO.WriteRope["Empty object not included\n"]; RETURN};
ob ← CDRects.CreateRect[sz, l];
CDOps.AddAnObject[
design: design,
ob: ob,
location: CDBasics.BaseOfRect[r],
orientation: orient]
END;
AddRect:
PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Add rect\n"];
AddARect[comm.design, CDBasics.ToRect[comm.sPos, comm.pos], comm.l];
END;
AddWire:
PROC [comm: CDSequencer.Command] =
--uses pos, sPos, n (for width), b (for firstHorizontal), l (for layer)
BEGIN
InternalAddWire[comm: comm, firstOnly: FALSE]
END;
ContinueWire:
PROC [comm: CDSequencer.Command] =
BEGIN
InternalAddWire[comm: comm, firstOnly: TRUE]
END;
InternalAddWire:
PROC [comm: CDSequencer.Command, firstOnly:
BOOL←
FALSE] =
--this procedure knows EXACTLY the algorithm used for showing
--temporary wires in the cursor part
BEGIN
start: CD.Position ← comm.sPos;
stop: CD.Position ← comm.pos;
wireWidth: CD.Number ← comm.n;
IF wireWidth=0 THEN {AddRect[comm]; RETURN};
TerminalIO.WriteRope["Add wire\n"];
IF
--firstHorizontal-- comm.b
THEN {
IF stop.x<=start.x
AND stop.x>=start.x-wireWidth
AND (stop.y<start.y OR stop.y>start.y+wireWidth) THEN { --crazy vertical wire
IF
ABS[start.y-stop.y]<
CD.lambda
THEN
{TerminalIO.WriteRope[" Empty Wire not added\n"]; RETURN};
stop.x ← start.x+wireWidth;
AddARect[comm.design, CDBasics.ToRect[start, stop], comm.l];
RETURN
};
--not only crazy vertical
IF stop.y>=start.y
AND stop.y<=start.y+wireWidth
THEN
{
--horizontal wire
stop.y ← start.y+wireWidth;
AddARect[comm.design, CDBasics.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, CDBasics.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, CDBasics.ToRect[start, stop], comm.l];
}
}
ELSE {
-- NOT firstHorizontalVC --
IF stop.y<=start.y
AND stop.y>=start.y-wireWidth
AND (stop.x<start.x OR stop.x>start.x+wireWidth) THEN { --crazy horizontal wire
IF
ABS[stop.x-start.x]<
CD.lambda
THEN
{TerminalIO.WriteRope[" Empty Wire not added\n"]; RETURN};
stop.y ← start.y+wireWidth;
AddARect[comm.design, CDBasics.ToRect[start, stop], comm.l];
RETURN
};
-- not only crazy horizontal
IF stop.x>=start.x
AND stop.x<=start.x+wireWidth
THEN
{
--vertical wire
stop.x ← start.x+wireWidth;
AddARect[comm.design, CDBasics.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, CDBasics.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, CDBasics.ToRect[start, stop], comm.l];
}
}
END;
DeleteSelected:
PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Delete selected "];
CDSimpleOps.DeleteSelected[comm.design];
TerminalIO.WriteLn[];
END;
Undelete:
PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Undelete\n"];
CDSimpleOps.Undelete[comm.design]
END;
AbortCommand:
PROC [comm: CDSequencer.Command] =
BEGIN
TerminalIO.WriteRope["Try to abort current command\n"];
CDSequencer.AbortTheCommand[comm.design]
END;
CDSequencer.ImplementCommand[$AbortCommand, AbortCommand,, dontQueue];
CDSequencer.ImplementCommand[$DrawRect, AddRect];
CDSequencer.ImplementCommand[$DrawWire, AddWire];
CDSequencer.ImplementCommand[$ContinueWire, ContinueWire];
CDSequencer.ImplementCommand[$DeleteS, DeleteSelected];
CDSequencer.ImplementCommand[$Undel, Undelete];
END.