-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadder.go
50 lines (44 loc) · 1.51 KB
/
adder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main
func NewSimpleAdder(input1, input2 *Node) (out, carry *Node, adder *CustomComponent) {
out, xorGate := NewXorGate(input1, input2)
carry, andGate := NewAndGate(input1, input2)
adder = NewCustomComponent(
"SimpleAdder",
[]Component{xorGate, andGate},
[]*Node{input1, input2},
)
return
}
func NewFullAdder(input1, input2, carryIn *Node) (out, carry *Node, adder *CustomComponent) {
intermediateXorOut, intermediateXorGate := NewXorGate(input1, input2)
out, xorGate := NewXorGate(intermediateXorOut, carryIn)
intermediateAnd1Out, intermediateAnd1Gate := NewAndGate(input1, input2)
intermediateAnd2Out, intermediateAnd2Gate := NewAndGate(input1, carryIn)
intermediateAnd3Out, intermediateAnd3Gate := NewAndGate(input2, carryIn)
intermediateOrOut, intermediateOrGate := NewOrGate(intermediateAnd1Out, intermediateAnd2Out)
carry, andGate := NewOrGate(intermediateOrOut, intermediateAnd3Out)
adder = NewCustomComponent(
"FullAdder",
[]Component{
intermediateXorGate,
xorGate,
intermediateAnd1Gate,
intermediateAnd2Gate,
intermediateAnd3Gate,
intermediateOrGate,
andGate,
},
[]*Node{input1, input2, carryIn},
)
return
}
func NewAdderSubtractor(input1, input2, carryIn, operation *Node) (out, carry *Node, component *CustomComponent) {
xorOut, xorGate := NewXorGate(input2, operation)
out, carry, adder := NewFullAdder(input1, xorOut, carryIn)
component = NewCustomComponent(
"AdderSubtractor",
[]Component{xorGate, adder},
[]*Node{input1, input2, carryIn, operation},
)
return
}