CMosBPolyCommands.mesa (part of ChipNDale)
Copyright Ó 1983, 1986, 1988 by Xerox Corporation. All rights reserved.
Created by Louis Monier, November 7, 1988 11:33:59 am PST
Last edited by: Louis Monier, November 7, 1988 5:06:39 pm PST
DIRECTORY
CD,
CDAtomicObjects,
CDLayers,
CDOps,
CDCommandOps,
CDPanel,
CDPanelFonts,
CDSequencer,
CDTexts,
CDValue,
CDViewer,
IO,
Rope,
TerminalIO,
CMosB,
ViewerClasses,
ViewerOps;
CMosBPolyCommands:
CEDAR
PROGRAM
IMPORTS CD, CDAtomicObjects, CDCommandOps, CDLayers, CDOps, CDPanel, CDPanelFonts, CDSequencer, CDTexts, CDValue, CDViewer, TerminalIO, CMosB, ViewerOps =
BEGIN
lambda: CD.Number = CMosB.lambda;
CreateXstr:
PROC [comm: CDSequencer.Command] = {
ob: CD.Object;
layer: CD.Layer;
size: CD.Position ← [50*lambda, 30*lambda];
TerminalIO.PutRope["create transistor "];
SELECT comm.key
FROM
$DrawNXstr => layer ← CMosB.ndif;
$DrawWNXstr => layer ← CMosB.wndif;
$DrawPXstr => layer ← CMosB.pdif;
$DrawWPXstr => layer ← CMosB.wpdif;
ENDCASE => layer ← CMosB.ndif;
TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"];
ob ← CDAtomicObjects.CreateAtomicOb[$C2PolyTrans, size, comm.design.technology, layer];
CDCommandOps.IncludeOb[comm, ob]
};
CreateLXstr:
PROC [comm: CDSequencer.Command] = {
ob: CD.Object;
layer: CD.Layer;
size: CD.Position ← [50*lambda, 50*lambda];
TerminalIO.PutRope["create L transistor "];
SELECT comm.key
FROM
$DrawAngleNXstr => layer ← CMosB.ndif;
$DrawAngleWNXstr => layer ← CMosB.wndif;
$DrawAnglePXstr => layer ← CMosB.pdif;
$DrawAngleWPXstr => layer ← CMosB.wpdif;
ENDCASE => layer ← CMosB.ndif;
TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"];
ob ← CDAtomicObjects.CreateAtomicOb[$C2PolyLTrans, size, comm.design.technology, layer];
CDCommandOps.IncludeOb[comm, ob]
};
CreateLargeCont:
PROC [comm: CDSequencer.Command] = {
ob: CD.Object;
layer: CD.Layer;
TerminalIO.PutRope["create large contact "];
SELECT comm.key
FROM
$DrawNDifCon => layer ← CMosB.ndif;
$DrawWNDifCon => layer ← CMosB.wndif;
$DrawPDifCon => layer ← CMosB.pdif;
$DrawWPDifCon => layer ← CMosB.wpdif;
$DrawPolCon => layer ← CMosB.pol;
$DrawNWCntCon => layer ← CMosB.nwellCont;
$DrawPWCntCon => layer ← CMosB.pwellCont;
$DrawWNWCntCon => layer ← CMosB.wnwellCont;
$DrawWPWCntCon => layer ← CMosB.wpwellCont;
ENDCASE => layer ← CMosB.pol;
TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"];
ob ← CDAtomicObjects.CreateAtomicOb[$C2PolyLargeSimpleCon, [0, 0], comm.design.technology, layer];
CDCommandOps.IncludeOb[comm, ob]
};
CreateLargeVia:
PROC [comm: CDSequencer.Command] = {
ob: CD.Object;
TerminalIO.PutRope["create large via\n"];
ob ← CDAtomicObjects.CreateAtomicOb[$C2PolyLargeVia, [0, 0], comm.design.technology];
IF ob=
NIL
THEN
TerminalIO.PutRope["not done\n"]
ELSE
[] ← CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos]
};
DiffToPWorld:
PROC [comm: CDSequencer.Command] = {
layer: CD.Layer = CDLayers.CurrentLayer[comm.design];
TerminalIO.PutRope["Switch diffusion to P type"];
SELECT layer
FROM
CMosB.ndif, CMosB.wndif => CDLayers.SetCurrentLayer[comm.design, CMosB.wpdif];
CMosB.pwellCont, CMosB.wpwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.wnwellCont];
ENDCASE => TerminalIO.PutRope[" not done"];
TerminalIO.PutRope["\n"];
};
DiffToNWorld:
PROC [comm: CDSequencer.Command] = {
layer: CD.Layer = CDLayers.CurrentLayer[comm.design];
TerminalIO.PutRope["Switch diffusion to N type"];
SELECT layer
FROM
CMosB.pdif, CMosB.wpdif => CDLayers.SetCurrentLayer[comm.design, CMosB.ndif];
CMosB.wnwellCont, CMosB.nwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.pwellCont];
ENDCASE => TerminalIO.PutRope[" not done"];
TerminalIO.PutRope["\n"];
};
SchematicModeComm:
PROC [comm: CDSequencer.Command] = {
GetGrid:
PROC [viewer: ViewerClasses.Viewer]
RETURNS [i:
INT ← -1] = {
WITH ViewerOps.GetViewer[viewer, $Grid]
SELECT
FROM
ri: REF INT => i ← ri^;
ENDCASE => NULL;
};
font: CDTexts.CDFont ← CDPanelFonts.CurrentFont[comm.design];
viewer: ViewerClasses.Viewer ← CDViewer.GetViewer[comm];
IF viewer#
NIL
THEN {
is: INT ← GetGrid[viewer];
goal: INT ← MAX[2*CMosB.lambda, is];
IF goal#is THEN ViewerOps.SetViewer[viewer: viewer, data: NEW[INT←goal], op: $Grid];
};
CDValue.StoreInt[comm.design, $PanelLayerMode, 0];
CDValue.StoreInt[comm.design, $CDxStepValue, 0];
[] ← CDPanel.PutUp[comm.design, $CDxStepValue];
CDLayers.SetCurrentLayer[comm.design, CD.commentLayer];
CDLayers.SetLayerWidth[comm.design, CD.commentLayer, CMosB.lambda/2];
[] ← CDPanel.PutUp[comm.design, $PanelLayerMode];
[] ← CDPanelFonts.SetCurrentFont[comm.design, CDTexts.MakeFont[font.supposedName, CMosB.lambda/2]];
TerminalIO.PutRope["schematics mode\n"];
};
LayoutModeComm:
PROC [comm: CDSequencer.Command] = {
font: CDTexts.CDFont ← CDPanelFonts.CurrentFont[comm.design];
viewer: ViewerClasses.Viewer ← CDViewer.GetViewer[comm];
IF viewer#
NIL
THEN
ViewerOps.SetViewer[viewer: viewer, data: NEW[INT𡤅*CMosB.lambda], op: $Grid];
CDValue.StoreInt[comm.design, $PanelLayerMode, 1];
CDValue.StoreInt[comm.design, $CDxStepValue, 0];
[] ← CDPanel.PutUp[comm.design, $CDxStepValue];
IF
CD.LayerTechnology[CDLayers.CurrentLayer[comm.design]]=
NIL
THEN
CDLayers.SetCurrentLayer[comm.design, CD.commentLayer];
[] ← CDPanel.PutUp[comm.design, $PanelLayerMode];
[] ← CDPanelFonts.SetCurrentFont[comm.design, CDTexts.MakeFont[font.supposedName, CMosB.lambda/4]];
CDLayers.SetLayerWidth[comm.design, CMosB.ndif, 10*CMosB.lambda];
CDLayers.SetLayerWidth[comm.design, CMosB.wpdif, 10*CMosB.lambda];
CDLayers.SetLayerWidth[comm.design, CMosB.pol, 10*CMosB.lambda];
CDLayers.SetLayerWidth[comm.design, CMosB.met, 15*CMosB.lambda];
CDLayers.SetLayerWidth[comm.design, CMosB.met2, 15*CMosB.lambda];
TerminalIO.PutRope["layout mode\n"];
};
Init:
PROC [] = {
MakeComm:
PROC [key:
ATOM, p: CDSequencer.CommandProc, qm: CDSequencer.QueueMethod𡤍oQueue] = {
CDSequencer.ImplementCommand[key, p, CMosB.cmosB, qm];
};
fontNames:
LIST
OF Rope.
ROPE =
LIST[
"4 Helvetica8", "4 Helvetica8B", "4 Helvetica12", "4 Helvetica6", "4 Helvetica6B",
"4 TimesRoman8", "2 Helvetica8", "1 Helvetica8", "8 Helvetica8", "4 Gates32"];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerComment, CD.commentLayer, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNWell, CMosB.nwell, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPWell, CMosB.pwell, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNDif, CMosB.ndif, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPol, CMosB.pol, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerMet2, CMosB.met2, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerMet, CMosB.met, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPDif, CMosB.wpdif, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNWCnt, CMosB.nwellCont, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPWCnt, CMosB.pwellCont, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerWNWCnt, CMosB.wnwellCont, CMosB.cmosB];
CDCommandOps.RegisterCurrentLayerCommand[$SetLayerWPWCnt, CMosB.wpwellCont, CMosB.cmosB];
MakeComm[$TestDifFlipToPWorld, DiffToPWorld];
MakeComm[$TestDifFlipToNWorld, DiffToNWorld];
MakeComm[$DiffToPWorld, DiffToPWorld];
MakeComm[$DiffToNWorld, DiffToNWorld];
MakeComm[$DrawNXstr, CreateXstr, doQueueAndMark];
MakeComm[$DrawPXstr, CreateXstr, doQueueAndMark];
MakeComm[$DrawWNXstr, CreateXstr, doQueueAndMark];
MakeComm[$DrawWPXstr, CreateXstr, doQueueAndMark];
MakeComm[$DrawAngleNXstr, CreateLXstr, doQueueAndMark];
MakeComm[$DrawAnglePXstr, CreateLXstr, doQueueAndMark];
MakeComm[$DrawAngleWNXstr, CreateLXstr, doQueueAndMark];
MakeComm[$DrawAngleWPXstr, CreateLXstr, doQueueAndMark];
MakeComm[$DrawNDifCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawWNDifCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawPDifCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawWPDifCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawPolCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawNWCntCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawPWCntCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawWNWCntCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawWPWCntCon, CreateLargeCont, doQueueAndMark];
MakeComm[$DrawMm2Con, CreateLargeVia, doQueueAndMark];
MakeComm[$SetLayoutMode, LayoutModeComm];
MakeComm[$SetSchematicMode, SchematicModeComm];
CDPanelFonts.ImplementIt[tech: CMosB.cmosB, layerProc: CommentLayer, defaultFonts: fontNames];
CDCommandOps.RegisterCommanderNewDesign[CMosB.cmosB];
};
CommentLayer:
PROC [
CD.Layer]
RETURNS [
CD.Layer] = {
RETURN [CD.commentLayer];
};
Init[];
END.