CDMoreCoreGeneratorsImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
by Christian Jacobi, August 14, 1985 2:35:33 pm PDT
Last Edited by Christian Jacobi, October 4, 1985 4:44:52 pm PDT
DIRECTORY
CD,
CDCore,
CDOrient,
CDUtil,
Core,
CoreClasses,
CoreProperties,
Rope;
CDMoreCoreGeneratorsImpl: CEDAR MONITOR
IMPORTS CDCore, CDUtil, CoreClasses, CoreProperties =
BEGIN
ToOrient: PROC [x: REF] RETURNS [o: CD.Orientation ← CD.original] =
BEGIN
WITH x SELECT FROM
p: REF CD.Orientation => o ← p^;
a: ATOM => SELECT a FROM
$original   => o ← CDOrient.original;
$mirrorX   => o ← CDOrient.mirrorX;
$rotate90   => o ← CDOrient.rotate90;
$rotate90X => o ← CDOrient.rotate90X;
$rotate180  => o ← CDOrient.rotate180;
$rotate180X  => o ← CDOrient.rotate180X;
$mirrorY   => o ← CDOrient.mirrorY;
$rotate270  => o ← CDOrient.rotate270;
$rotate270X  => o ← CDOrient.rotate270X;
ENDCASE  => ERROR;
ENDCASE => IF x#NIL THEN ERROR;
END;
ToDir: PROC [x: REF] RETURNS [dir: CDUtil.Direction ← right] =
BEGIN
WITH x SELECT FROM
p: REF CDUtil.Direction => dir ← p^;
a: ATOM => SELECT a FROM
$right  => dir ← right;
$up   => dir ← up;
$left   => dir ← left;
$down  => dir ← down;
$none  => dir ← none;
ENDCASE => ERROR;
ENDCASE => IF x#NIL THEN ERROR;
END;
RecastToRecord: PROC [c: Core.CellType] RETURNS [cell: Core.CellType] =
BEGIN
cell ← c;
WHILE cell.class#CoreClasses.recordCellClass DO
cell ← cell.class.recast[cell];
ENDLOOP;
END;
CDAbutGenerator: CDCore.CreateProc =
BEGIN
dir: CDUtil.Direction;
instL: LIST OF CDUtil.InstRec ← NIL;
reOrdered: CoreClasses.CellInstanceList;
name: Rope.ROPE ← coreCellType.name;
coreCellType ← RecastToRecord[coreCellType];
IF param=NIL THEN dir ← right ELSE dir ← ToDir[param.first];
--make a reordered copy of the Core instance list
FOR l: CoreClasses.CellInstanceList ← NARROW[coreCellType.data, CoreClasses.RecordCellType].instances, l.rest WHILE l#NIL DO
reOrdered ← CONS[l.first, reOrdered];
ENDLOOP;
--build a CDUtil instance list
FOR list: CoreClasses.CellInstanceList ← reOrdered, list.rest WHILE list#NIL DO
inst: CDUtil.InstRec = [
ob: CDCore.CreateCDFromCore[coreDesign: coreDesign, coreCellType: list.first.type, cdDesign: cdDesign],
name: list.first.name,
orient: ToOrient[CoreProperties.GetProp[list.first.properties, $CDOrient]]
];
instL ← CONS[inst, instL];
ENDLOOP;
--build the resulting object
ob ← CDUtil.CreateSimpleCell[design: cdDesign, contents: instL, direction: dir, cellName: name]
END;
CDCore.RegisterGenerator[CDAbutGenerator, $Abut];
END.