NB. circuit primitives

or =: +.
nor =: ([: -. +.)"0
and =: *.
nand =: ([: -. *.)"0
not =: -.

NB. circuit models

bitOr =: monad define
('a' ; 'b') =. y.
a or b
)

bitAnd =: monad define
('a' ; 'b') =. y.
a and b
)

bitNot =: not

NB. half adder

bitHalfAdder =: monad define
('a' ; 'b') =. y.
bitOr (bitAnd a , bitNot b) , bitAnd (bitNot a) , b
)

bitXor =: bitHalfAdder

bitAdder =: monad define
('a' ; 'b' ; 'cin') =. y.
t =. bitHalfAdder a , b
g =. bitAnd a , b
p =. bitAnd t , cin
(bitOr g , p) , bitHalfAdder t , cin
)

wireOutput =: monad define
('pin' ; 'outputs') =. y.
pin from outputs
)

twoBitAdder =: monad define
('a1' ; 'a0' ; 'b1' ; 'b0') =. y.
t0 =. bitAdder a0 , b0 , 0
t1 =. bitAdder a1 , b1 , wireOutput 0 ; t0
(wireOutput 0 1 ; t1) , wireOutput 1 ; t0
)

