-- JaMMOSSIMFnsImplA.mesa
-- created by Haeberli from JamMOSSIM.mesa: 7-Jan-82 13:17:11
DIRECTORY
IODefs,
JaMFnsDefs,
JaMMasterDefs USING [Object],
JaMMOSSIMFns,
Mopcodes,
MOSSIMFns,
StreamDefs,
StringDefs,
SystemDefs,
WF;
JaMMOSSIMFnsImplA: PROGRAM
IMPORTS IODefs, JaMFnsDefs, MOSSIMFns, SystemDefs, WF
EXPORTS JaMMOSSIMFns =
{
OPEN JaMFnsDefs, MOSSIMFns, StreamDefs;
-- a buffer for receiving arguments
line: STRING ← SystemDefs.AllocateHeapString[256];
Init: PUBLIC PROC = {
steps: CARDINAL;
targc ← 1;
steps ← initializationResult[];
PushInteger[LOOPHOLE[steps, INTEGER]]};
SimRead: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; readFileString[]};
SetInputHigh: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; setInputH[]};
SetInputLow: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; setInputL[]};
SetInputX: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; setInputX[]};
Question: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; question[]};
Exclamation: PUBLIC PROC = {
targv[1].length ← 0; PopString[targv[1]]; targc ← 2; exclamation[]};
GetNodeValue: PUBLIC PROC = {
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
PushInteger[getNodeValue[]]};
PrintNodeValue: PUBLIC PROC = {
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
IODefs.WriteChar[LOOPHOLE[getNodeValue[] + '0, CHARACTER]]};
Step: PUBLIC PROC = {value: INTEGER; targc ← 1; value ← step[]; PushInteger[value]};
-- BitString receives a string of tokens that are separated by spaces.
--The first token is the name of the vector and the rest are the
--rest are the names of the transistors that constitute the vector.
BitString: PUBLIC PROC = {
line.length ← 0; PopString[line]; BreakIntoTokens[line]; setBitsString[]};
-- GetVectorValue returns a string of values ('0,'1,'X) of the vector
--defined by BitString
GetVectorValue: PUBLIC PROC = {
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
PushString[vectorValue[]]};
GetVectorWord: PUBLIC PROC = {
i, inc: CARDINAL;
result: STRING;
word: INTEGER;
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
result ← vectorValue[];
IF result.length > 16 THEN WF.WF1["Vector too long: %s*n", result];
word ← 0;
FOR i IN [0..result.length) DO
IF result[i] = '0 THEN inc ← 0
ELSE
IF result[i] = '1 THEN inc ← 1
ELSE {WF.WF1["Vector undefined: %s*n", result]; EXIT};
word ← word*2 + inc
ENDLOOP;
PushInteger[word]};
PutVectorValue: PUBLIC PROC = {
arg1: LONG INTEGER;
ob: JaMMasterDefs.Object;
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
ob ← PopObject[];
WITH dob: ob SELECT FROM
IntegerType => arg1 ← LONG[dob.IntegerVal];
ENDCASE => BEGIN PushObject[ob]; arg1 ← JaMFnsDefs.PopLongInteger[]; END;
putVectorValue[arg1]};
-- PrintVectorValue is similar to GetVectorValue, except the output is printed.
PrintVectorValue: PUBLIC PROC = {
targc ← 2;
targv[1].length ← 0;
PopString[targv[1]];
IODefs.WriteString[vectorValue[]]};
-- ResetChangeCount sets all the changecount fields of nodes to 0
ResetChangeCount: PUBLIC PROC = {resetChangeCount[]};
-- DisplayChangedNodes displays in the file "mossim.log" the
--number of times nodes have changed their potentials
DisplayChangedNodes: PUBLIC PROC = {displayChangedNodes[]};
-- TraceNode will set the trace flag of a node
TraceNodes: PUBLIC PROC = {
line.length ← 0; PopString[line]; BreakIntoTokens[line]; traceNodes[]};
UnTraceNodes: PUBLIC PROC = {
line.length ← 0; PopString[line]; BreakIntoTokens[line]; unTraceNodes[]};
Warning: PUBLIC PROC = {ToggleWarning[]};
Enter: PUBLIC PROC = {MOSSIMEnter[]};
-- Private procedure
BreakIntoTokens: PROC [line: STRING] = {
pos: CARDINAL ← 0;
Get: PROC [s: STRING] RETURNS [STRING] = {
char: CHARACTER;
end, length: CARDINAL;
s.length ← length ← 0;
IF (end ← pos) >= line.length THEN RETURN[NIL];
DO
SELECT (char ← line[end]) FROM
' , IODefs.TAB, ', => EXIT;
IODefs.CR => IF end = 0 THEN RETURN[NIL] ELSE EXIT;
ENDCASE => {
s[length] ← char;
end ← end + 1;
length ← length + 1;
IF end >= line.length THEN EXIT}
ENDLOOP;
s.length ← length;
pos ← end + 1;
RETURN[s]};
targc ← 1;
UNTIL Get[targv[targc]] = NIL DO targc ← targc + 1 ENDLOOP;
};
}.