-- NewPadsDriver.sak
-- last edited by Suzuki: 20-Jan-82 16:53:33
DIRECTORY
SakuraRT,
NewPads,
SimIO;
NewPadsDriver: MONITOR IMPORTS SakuraRT, NewPads, SimIO = {
PadsDriver: DEVICE = {
IN Clock: BOOLEAN, AIn, BIn: CARDINAL, EnableIn, EqualIn: CARDINAL
OUT AOut, BOut: CARDINAL, EnableOut, EqualOut: CARDINAL
GUARDIAN {}
CONTROL {
Power: PROC [left, exponent: CARDINAL] RETURNS [ret: CARDINAL] = {
ret ← 1;
THROUGH [0..exponent) DO
ret ← ret*left
ENDLOOP};
Print: PROC [en, eq: CARDINAL, a, b: CARDINAL] = {
SimIO.WF4["Enable = %d*nEqual = %d*nA = %d, %d*n", en, eq, a, a];
SimIO.WF2["B = %d, %d*n", b, b]
};
Step: PROC [aOrB, out, enable: CARDINAL] = {
WHEN Clock CHANGE: Print[EnableIn, EqualIn, AIn, BIn];
IF aOrB = 1 THEN AOut ← out ELSE BOut ← out;
EnableOut ← enable;
};
UpAndDown: PROC [out, enable: CARDINAL] = {
Step[enable, out, 0];
Step[enable, out, enable];
Step[enable, out, 0];
};
Enable: PROC [enable: CARDINAL] = {
FOR i: NAT IN [0..8) DO
UpAndDown[0, enable];
UpAndDown[Power[2, i], enable];
Step[enable, 0, 0];
Step[enable, 0, enable];
ENDLOOP
};
WHEN Clock CHANGE: {EnableOut ← 0;
EqualOut ← 0;
AOut ← 0;
BOut ← 0;
SakuraRT.Delay[10]};
Enable[1];
Enable[2];
}
};
ClockDriver: DEVICE = {
IN
OUT Clock: BOOLEAN
GUARDIAN {}
CONTROL {
DO
Clock ← TRUE;
SakuraRT.Delay[20];
ENDLOOP }
};
SimIO.Start[];
CIRCUIT {
COMPONENTS cl: ClockDriver, pd: PadsDriver, pi: NewPads.PadsFunc
NODES a, b, c, en, eq: NODE
REPRESENTATION
CONNECTIONS
cl[Clock: c],
pd[Clock: c, AIn: a, BIn: b, EnableIn: en, EqualIn: eq, AOut: a, BOut: b,
EnableOut: en, EqualOut: eq],
pi[Clock: c, A: a, B: b, Enable: en, Equal: eq]};
SimIO.Stop[];
}.