%%HP: T(3)A(R)F(.);
DIR
DEMO { { "CLK" 5
5 M } { "CLK" 10 10
N } { "CLK" 20 20 P
} { "FADD" M N P S
C } }
FADD { { A B CIN
SUM COUT } { {
"HADD" A B S1 C1 }
{ "HADD" CIN S1 SUM
C2 } { "OR" C1 C2
COUT } } }
HADD { { A B SUM
CARRY } { { "XOR" A
B SUM } { "AND" A B
CARRY } } }
SIM
\<< INIT TITLE 1
SWAP
FOR j
NXTSTATE 1 OUT.L
SIZE
FOR i OUT.L
i GET NAME.L SWAP
POS STATE SWAP GET
-4 * 6 + i 1 - 8 *
+ R\->B j 29 + R\->B
SWAP 2 \->LIST PIXON
NEXT
NEXT 7 FREEZE
0 WAIT DROP TEXT
\>>
ALL
\<< NAME.L NODES
\>>
NODES
\<< 'OUT.L' STO
\>>
COMPILE
\<< NEWC RCL DUP
SIZE \-> cir siz
\<< 1 siz
FOR i cir i
GET COMGATE
NEXT
\>>
\>>
MUX4 { { A B C D
SA SB Y } { { "MUX"
SA A B YA } { "MUX"
SA C D YB } { "MUX"
SB YA YB Y } } }
MUX { { SEL A B Y
} { { "NOT" SEL NS
} { "AND" A NS YA }
{ "AND" B SEL YB }
{ "OR" YA YB Y } }
}
MACCNT 3
TITLE
\<< ERASE { # 1Eh
# 0h } { # 1Eh
# 3Fh } LINE OUT.L
SIZE 8 MIN 1 SWAP
FOR i OUT.L i
GET \->STR DUP SIZE 1
- 2 SWAP SUB DUP
SIZE 5 MIN 1 SWAP
SUB 2 \->GROB i 1 - 8
* R\->B # 0h SWAP 2
\->LIST SWAP PICT 3
ROLLD GOR
NEXT { # 0h
# 0h } PVIEW
\>>
PPAR {
(-6.5,-3.1)
(6.5,3.2) X 0 (0,0)
FUNCTION Y }
OUT.L { M N P S C
}
NXTSTATE
\<< 1 CIRCUIT.L
SIZE
FOR i
CIRCUIT.L i GET DUP
1 GET "D" SWAP +
OBJ\->
NEXT
'STATE.CNT' INCR
DROP STATE.NEW
'STATE' STO
\>>
TMP { { "CLK" 5 5
R } { "CLK" 10 10 Q
} { "CLK" 20 20 P }
{ "MUX" P Q R S } }
STATE { 1 1 0 0 1
0 0 1 }
DCLK
\<< DUP DUP 2 GET
SWAP 3 GET \-> n m
\<< STATE.CNT n
m + MOD n \>= SWAP 4
GET SWAP STATE.NEW
3 ROLLD PUT
'STATE.NEW' STO
\>>
\>>
DLO
\<< 2 GET
'STATE.NEW' SWAP 0
PUT
\>>
DHI
\<< 2 GET
'STATE.NEW' SWAP 1
PUT
\>>
DXOR
\<< DUP 2 GET
STATE SWAP GET OVER
3 GET STATE SWAP
GET XOR SWAP 4 GET
STATE.NEW 3 ROLLD
SWAP PUT
'STATE.NEW' STO
\>>
DOR
\<< DUP 2 GET
STATE SWAP GET OVER
3 GET STATE SWAP
GET OR SWAP 4 GET
STATE.NEW 3 ROLLD
SWAP PUT
'STATE.NEW' STO
\>>
DAND
\<< DUP 2 GET
STATE SWAP GET OVER
3 GET STATE SWAP
GET AND SWAP 4 GET
STATE.NEW 3 ROLLD
SWAP PUT
'STATE.NEW' STO
\>>
DNOT
\<< DUP 2 GET
STATE SWAP GET NOT
SWAP 3 GET
STATE.NEW 3 ROLLD
SWAP PUT
'STATE.NEW' STO
\>>
DBUF
\<< DUP 2 GET
STATE SWAP GET SWAP
3 GET STATE.NEW 3
ROLLD SWAP PUT
'STATE.NEW' STO
\>>
STATE.CNT 100
STATE.NEW { 1 1 0
0 1 0 0 1 }
INIT
\<< NAME.L SIZE
CLIST DUP 'STATE'
STO 'STATE.NEW' STO
0 'STATE.CNT' STO
\>>
COMGATE
\<< DUP SIZE OVER
1 GET PRIM OVER POS
IF 0 ==
THEN MACRO
ELSE 1 \->LIST
SWAP 2 SWAP
FOR i OVER
i GET DUP TYPE
IF 6 ==
THEN
ADDNAME
END 1
\->LIST +
NEXT SWAP
DROP 1 \->LIST
CIRCUIT.L SWAP +
'CIRCUIT.L' STO
END
\>>
ADDNAME
\<< NAME.L OVER
POS DUP
IF 0 ==
THEN DROP
NAME.L SWAP + DUP
'NAME.L' STO SIZE
ELSE SWAP
DROP
END
\>>
NEWC
\<< { } DUP
'CIRCUIT.L' STO
'NAME.L' STO 0
'MACCNT' STO
\>>
CIRCUIT.L { {
"CLK" 5 5 1 } {
"CLK" 10 10 2 } {
"CLK" 20 20 3 } {
"XOR" 1 2 4 } {
"AND" 1 2 5 } {
"XOR" 3 4 6 } {
"AND" 3 4 7 } {
"OR" 5 7 8 } }
NAME.L { M N P
S1.1 C1.1 S C2.1 C
}
MACRO
\<< DROP DROP
OBJ\-> 1 - \->LIST
'MACCNT' INCR \->
arglist locmac
\<< OBJ\-> OBJ\->
DROP \-> extrn circ
\<< 1 circ
SIZE
FOR i
circ i GET 2 OVER
SIZE
FOR j
DUP j GET DUP TYPE
IF 6
==
THEN
extrn OVER POS
IF 0 ==
THEN \->STR 1 OVER
SIZE 1 - SUB "." +
locmac \->STR + "'" +
OBJ\-> j SWAP PUT
ELSE extrn SWAP POS
arglist SWAP GET j
SWAP PUT
END
END
NEXT
COMGATE
NEXT
\>>
\>>
\>>
PRIM { "AND" "OR"
"XOR" "NOT" "BUF"
"HI" "LO" "CLK" }
CLIST
\<< { } SWAP 1
SWAP
START { 0 } +
NEXT
\>>
END