RopePorts.Mesa
last edited by Spreitzer April 27, 1985 9:59:06 pm PST
DIRECTORY Asserting, AssertingIO, Basics, FS, IO, Rope, RoseCreate, RoseTranslateTypes, RoseTranslateInsides, RoseTypes;
RopePorts: CEDAR PROGRAM
IMPORTS AssertingIO, FS, IO, RoseTranslateInsides
EXPORTS RoseCreate =
BEGIN OPEN RoseTypes, RoseTranslateTypes, RoseTranslateInsides;
PortsFromROPE: PUBLIC PROC [asRope: ROPE] RETURNS [ports: Ports] =
{ports ← PortsFromStream[IO.RIS[asRope]]};
PortsFromFile: PUBLIC PROC [fileName: ROPE] RETURNS [ports: Ports] =
{ports ← PortsFromStream[FS.StreamOpen[fileName]]};
PortsFromStream: PUBLIC PROC [stream: STREAM] RETURNS [ports: Ports] =
BEGIN
length: CARDINAL ← stream.GetCard[];
ports ← NEW [PortsRep[length]];
FOR portIndex: CARDINAL IN [0 .. length) DO
simple: Field ← GetField[stream];
switch: Field ← GetField[stream];
name: ROPE ← stream.GetRopeLiteral[];
typeAsRope: ROPE ← stream.GetRopeLiteral[];
job: Job ← NEW [JobRep ← [
exec: NIL,
rootName: NIL,
from: IO.RIS[typeAsRope],
log: viewerLog,
type: Other]];
any: REF ANY ← ParseExpression[job];
type: NodeType ← WITH any SELECT FROM
sti: SignalTypeInvocation => sti.st,
id: ID => InstantiateSignalType[job, id.rope, NIL].st,
ENDCASE => ERROR;
flags: [0 .. 16) ← stream.GetCard[];
other: Assertions ← AssertingIO.Read[stream];
ports[portIndex] ← [
simple: simple,
switch: switch,
name: name,
type: type,
input: (flags MOD 2) >= 1,
output: (flags MOD 4) >= 2,
XPhobic: (flags MOD 8) >= 4,
instructionsSimple: (flags MOD 16) >= 8,
other: other];
ENDLOOP;
[] ← stream.SkipWhitespace[flushComments: FALSE];
IF NOT stream.EndOf[] THEN ERROR;
END;
GetField: PROC [from: STREAM] RETURNS [f: Field] = {
bitOffset: CARDINAL ← from.GetCard[];
bitLength: CARDINAL ← from.GetCard[];
wordOffset: CARDINAL ← bitOffset/Basics.bitsPerWord;
wordoffbits: CARDINAL ← wordOffset*Basics.bitsPerWord;
f ← [wordOffset, bitOffset - wordoffbits, bitLength];
};
END.