%%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
