circuits 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +4 -4
- data/lib/circuits/component/base.rb +17 -0
- data/lib/circuits/version.rb +1 -1
- data/spec/unit/circuits/component/and_spec.rb +15 -24
- data/spec/unit/circuits/component/base_spec.rb +32 -8
- data/spec/unit/circuits/component/d_spec.rb +42 -42
- data/spec/unit/circuits/component/nand_spec.rb +16 -24
- data/spec/unit/circuits/component/nor_spec.rb +16 -24
- data/spec/unit/circuits/component/not_spec.rb +4 -8
- data/spec/unit/circuits/component/or_spec.rb +16 -24
- data/spec/unit/circuits/component/sr_nand_spec.rb +16 -16
- data/spec/unit/circuits/component/sr_nor_spec.rb +16 -16
- data/spec/unit/circuits/component/xnor_spec.rb +20 -28
- data/spec/unit/circuits/component/xor_spec.rb +20 -28
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NWRmNzIwNmQ5NTkxNmIyYmQ4MWM1ZTg4NWE4YzY1ZDBiYzRkMjhhNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OWZjOGE4YzQ1MWYyOTgzMmRiMzk2MGRmMmU3Njg3ZDFlYTcxN2Q0MA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODcyZjIwYWIyMjZhZDhlOGM2YTBjYjdkMjljNzFhYmQwYjBlZDE4ZGU5MjZj
|
10
|
+
MzNmMzg3NTFjZTBiNmM3MjUxZTgxNTdkYmEzNjIzNzliZmI4ZTE3YWRmMTBm
|
11
|
+
YTI1NmVmMWMxZDg0ODBlMmNkN2QwN2RmN2ZmMDc3NTcxMjVjNmI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MmQwZjU2NGJjZWE3MzYyYTU3ODFhN2Y2OWY5YmJmN2JhZTNkOGMwNmZhZmI4
|
14
|
+
MzMxYzZiYjQyZTI0NWVlZmUxMjZjZTgxNmQyYzBlYmY4YzEzZDE5ZjcyODMx
|
15
|
+
ZDY5ZTE0YjAzNzRiMDJjNDcxMWY1MWFlZjU3Y2ExYTgxZWNmM2Y=
|
data/README.md
CHANGED
@@ -38,13 +38,13 @@ Or install it yourself as:
|
|
38
38
|
```ruby
|
39
39
|
and_gate = Circuits::Component::And.new
|
40
40
|
# Set the inputs
|
41
|
-
and_gate
|
42
|
-
and_gate
|
41
|
+
and_gate.a.set true
|
42
|
+
and_gate.b.set false
|
43
43
|
# Update the AND gate
|
44
44
|
and_gate.tick # compute the next output from the inputs
|
45
45
|
and_gate.tock # apply to the output after all components have "ticked"
|
46
46
|
# Get the output
|
47
|
-
and_gate
|
47
|
+
and_gate.out.get # false
|
48
48
|
```
|
49
49
|
|
50
50
|
### Linking components
|
@@ -52,7 +52,7 @@ and_gate[:out].get # false
|
|
52
52
|
```ruby
|
53
53
|
and_gate = Circuits::Component::And.new
|
54
54
|
not_gate = Circuits::Component::Not.new
|
55
|
-
not_gate
|
55
|
+
not_gate.in.set and_gate.out
|
56
56
|
```
|
57
57
|
|
58
58
|
## Contributing
|
@@ -27,16 +27,33 @@ module Circuits
|
|
27
27
|
# the outputs of this component
|
28
28
|
attr_reader :outputs
|
29
29
|
|
30
|
+
# For easy access to the ports
|
31
|
+
# @param [Symbol] method_name The name of the method
|
32
|
+
# @return [Input, Outpus] The corresponding port
|
33
|
+
def method_missing(method_name, *_, &__)
|
34
|
+
res = self[method_name]
|
35
|
+
super if res.nil?
|
36
|
+
res
|
37
|
+
end
|
38
|
+
|
30
39
|
# Sets all the outputs expose what was set in #tick
|
31
40
|
def tock
|
32
41
|
outputs.each(&:tock)
|
33
42
|
end
|
34
43
|
|
44
|
+
# So we can advertise what ports are available from {#method_missing}
|
45
|
+
# @param [Symbol] method_name The name of the method
|
46
|
+
# @return [Boolean] Wether or a method call will be responded to
|
47
|
+
def respond_to_missing?(method_name, _)
|
48
|
+
!self[method_name].nil? || super
|
49
|
+
end
|
50
|
+
|
35
51
|
# Gets the teminal assigned to the port
|
36
52
|
# @param port [Symbol] The symbol that represents the terminal
|
37
53
|
# @return [Input, Output] The terminal
|
38
54
|
def [](port)
|
39
55
|
port_mapping = port_mappings[port]
|
56
|
+
return nil if port_mapping.nil?
|
40
57
|
port_number = port_mapping[:number]
|
41
58
|
case port_mapping[:type]
|
42
59
|
when :input
|
data/lib/circuits/version.rb
CHANGED
@@ -6,52 +6,43 @@ describe Circuits::Component::And do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::And.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= false' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq false
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= false' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq false
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= false' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq false
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= true' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq true
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
@@ -70,7 +61,7 @@ describe Circuits::Component::And do
|
|
70
61
|
it '= true' do
|
71
62
|
subject.tick
|
72
63
|
subject.tock
|
73
|
-
expect(subject
|
64
|
+
expect(subject.out.get).to eq true
|
74
65
|
end
|
75
66
|
end
|
76
67
|
|
@@ -80,7 +71,7 @@ describe Circuits::Component::And do
|
|
80
71
|
it '= false' do
|
81
72
|
subject.tick
|
82
73
|
subject.tock
|
83
|
-
expect(subject
|
74
|
+
expect(subject.out.get).to eq false
|
84
75
|
end
|
85
76
|
end
|
86
77
|
|
@@ -96,7 +87,7 @@ describe Circuits::Component::And do
|
|
96
87
|
it '= false' do
|
97
88
|
subject.tick
|
98
89
|
subject.tock
|
99
|
-
expect(subject
|
90
|
+
expect(subject.out.get).to eq false
|
100
91
|
end
|
101
92
|
end
|
102
93
|
end
|
@@ -28,26 +28,50 @@ describe Circuits::Component::Base do
|
|
28
28
|
context 'one input and one output' do
|
29
29
|
subject { MockComponent1.new }
|
30
30
|
|
31
|
-
it 'has the input available as
|
31
|
+
it 'has the input available as #in' do
|
32
32
|
expect(subject[:in]).to eq(subject.inputs[0])
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'has the output available as
|
35
|
+
it 'has the output available as #out' do
|
36
36
|
expect(subject[:out]).to eq(subject.outputs[0])
|
37
37
|
end
|
38
|
+
|
39
|
+
it 'has the input available as :in' do
|
40
|
+
expect(subject.in).to eq(subject.inputs[0])
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'has the output available as :out' do
|
44
|
+
expect(subject.out).to eq(subject.outputs[0])
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'gets nil when invalid' do
|
48
|
+
expect(subject[:a]).to eq(nil)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'responds to #in' do
|
52
|
+
expect(subject.respond_to? :in).to eq true
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'responds to #out' do
|
56
|
+
expect(subject.respond_to? :out).to eq true
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'does not respond to #a' do
|
60
|
+
expect(subject.respond_to? :a).to eq false
|
61
|
+
end
|
38
62
|
end
|
39
63
|
|
40
64
|
context 'two inputs and two outputs' do
|
41
65
|
subject { MockComponent2.new }
|
42
66
|
|
43
|
-
it 'has the inputs available as
|
44
|
-
expect(subject
|
45
|
-
expect(subject
|
67
|
+
it 'has the inputs available as #a and #b' do
|
68
|
+
expect(subject.a).to eq(subject.inputs[0])
|
69
|
+
expect(subject.b).to eq(subject.inputs[1])
|
46
70
|
end
|
47
71
|
|
48
|
-
it 'has the outputs available as
|
49
|
-
expect(subject
|
50
|
-
expect(subject
|
72
|
+
it 'has the outputs available as #c and #d' do
|
73
|
+
expect(subject.c).to eq(subject.outputs[0])
|
74
|
+
expect(subject.d).to eq(subject.outputs[1])
|
51
75
|
end
|
52
76
|
end
|
53
77
|
end
|
@@ -7,121 +7,121 @@ describe Circuits::Component::D do
|
|
7
7
|
|
8
8
|
context 'it has just been initialized' do
|
9
9
|
it 'is unset' do
|
10
|
-
expect(subject
|
11
|
-
expect(subject
|
10
|
+
expect(subject.q.get).to eq false
|
11
|
+
expect(subject.not_q.get).to eq true
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'is stable' do
|
15
15
|
subject.tick
|
16
16
|
subject.tock
|
17
|
-
expect(subject
|
18
|
-
expect(subject
|
17
|
+
expect(subject.q.get).to eq false
|
18
|
+
expect(subject.not_q.get).to eq true
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
context 'has just been set' do
|
23
23
|
before do
|
24
|
-
subject
|
24
|
+
subject.clk.set false
|
25
25
|
subject.tick
|
26
26
|
subject.tock
|
27
|
-
subject
|
28
|
-
subject
|
27
|
+
subject.d.set true
|
28
|
+
subject.clk.set true
|
29
29
|
subject.tick
|
30
30
|
subject.tock
|
31
|
-
subject
|
32
|
-
subject
|
31
|
+
subject.d.set false
|
32
|
+
subject.clk.set false
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'is set' do
|
36
|
-
expect(subject
|
37
|
-
expect(subject
|
36
|
+
expect(subject.q.get).to eq true
|
37
|
+
expect(subject.not_q.get).to eq false
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'is stable' do
|
41
41
|
subject.tick
|
42
42
|
subject.tock
|
43
|
-
expect(subject
|
44
|
-
expect(subject
|
43
|
+
expect(subject.q.get).to eq true
|
44
|
+
expect(subject.not_q.get).to eq false
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'd high has no effect' do
|
48
|
-
subject
|
48
|
+
subject.d.set true
|
49
49
|
subject.tick
|
50
50
|
subject.tock
|
51
|
-
expect(subject
|
52
|
-
expect(subject
|
51
|
+
expect(subject.q.get).to eq true
|
52
|
+
expect(subject.not_q.get).to eq false
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'clock has to be positive edge' do
|
56
|
-
subject
|
57
|
-
subject
|
56
|
+
subject.d.set false
|
57
|
+
subject.clk.set true
|
58
58
|
subject.tick
|
59
59
|
subject.tock
|
60
|
-
expect(subject
|
61
|
-
expect(subject
|
60
|
+
expect(subject.q.get).to eq true
|
61
|
+
expect(subject.not_q.get).to eq false
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'can be reset' do
|
65
65
|
subject.tick
|
66
66
|
subject.tock
|
67
|
-
subject
|
67
|
+
subject.clk.set true
|
68
68
|
subject.tick
|
69
69
|
subject.tock
|
70
|
-
expect(subject
|
71
|
-
expect(subject
|
70
|
+
expect(subject.q.get).to eq false
|
71
|
+
expect(subject.not_q.get).to eq true
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
75
|
context 'has just been reset' do
|
76
76
|
before do
|
77
|
-
subject
|
77
|
+
subject.clk.set false
|
78
78
|
subject.tick
|
79
79
|
subject.tock
|
80
|
-
subject
|
81
|
-
subject
|
80
|
+
subject.d.set false
|
81
|
+
subject.clk.set true
|
82
82
|
subject.tick
|
83
83
|
subject.tock
|
84
|
-
subject
|
84
|
+
subject.clk.set false
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'is reset' do
|
88
|
-
expect(subject
|
89
|
-
expect(subject
|
88
|
+
expect(subject.q.get).to eq false
|
89
|
+
expect(subject.not_q.get).to eq true
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'is stable' do
|
93
93
|
subject.tick
|
94
94
|
subject.tock
|
95
|
-
expect(subject
|
96
|
-
expect(subject
|
95
|
+
expect(subject.q.get).to eq false
|
96
|
+
expect(subject.not_q.get).to eq true
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'd high has no effect' do
|
100
|
-
subject
|
100
|
+
subject.d.set true
|
101
101
|
subject.tick
|
102
102
|
subject.tock
|
103
|
-
expect(subject
|
104
|
-
expect(subject
|
103
|
+
expect(subject.q.get).to eq false
|
104
|
+
expect(subject.not_q.get).to eq true
|
105
105
|
end
|
106
106
|
|
107
107
|
it 'clock has to be positive edge' do
|
108
|
-
subject
|
109
|
-
subject
|
108
|
+
subject.d.set true
|
109
|
+
subject.clk.set true
|
110
110
|
subject.tick
|
111
111
|
subject.tock
|
112
|
-
expect(subject
|
113
|
-
expect(subject
|
112
|
+
expect(subject.q.get).to eq false
|
113
|
+
expect(subject.not_q.get).to eq true
|
114
114
|
end
|
115
115
|
|
116
116
|
it 'can be set' do
|
117
117
|
subject.tick
|
118
118
|
subject.tock
|
119
|
-
subject
|
120
|
-
subject
|
119
|
+
subject.d.set true
|
120
|
+
subject.clk.set true
|
121
121
|
subject.tick
|
122
122
|
subject.tock
|
123
|
-
expect(subject
|
124
|
-
expect(subject
|
123
|
+
expect(subject.q.get).to eq true
|
124
|
+
expect(subject.not_q.get).to eq false
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
@@ -6,55 +6,47 @@ describe Circuits::Component::Nand do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::Nand.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= true' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq true
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= true' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq true
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= true' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq true
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= false' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq false
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
49
|
+
|
58
50
|
[3, 4, 8].each do |n|
|
59
51
|
context "with #{n} inputs" do
|
60
52
|
subject { Circuits::Component::Nand.new input_count: n }
|
@@ -69,7 +61,7 @@ describe Circuits::Component::Nand do
|
|
69
61
|
it '= false' do
|
70
62
|
subject.tick
|
71
63
|
subject.tock
|
72
|
-
expect(subject
|
64
|
+
expect(subject.out.get).to eq false
|
73
65
|
end
|
74
66
|
end
|
75
67
|
|
@@ -79,7 +71,7 @@ describe Circuits::Component::Nand do
|
|
79
71
|
it '= true' do
|
80
72
|
subject.tick
|
81
73
|
subject.tock
|
82
|
-
expect(subject
|
74
|
+
expect(subject.out.get).to eq true
|
83
75
|
end
|
84
76
|
end
|
85
77
|
|
@@ -95,7 +87,7 @@ describe Circuits::Component::Nand do
|
|
95
87
|
it '= true' do
|
96
88
|
subject.tick
|
97
89
|
subject.tock
|
98
|
-
expect(subject
|
90
|
+
expect(subject.out.get).to eq true
|
99
91
|
end
|
100
92
|
end
|
101
93
|
end
|
@@ -6,55 +6,47 @@ describe Circuits::Component::Nor do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::Nor.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= true' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq true
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= false' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq false
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= false' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq false
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= false' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq false
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
49
|
+
|
58
50
|
[3, 4, 8].each do |n|
|
59
51
|
context "with #{n} inputs" do
|
60
52
|
subject { Circuits::Component::Nor.new input_count: n }
|
@@ -69,7 +61,7 @@ describe Circuits::Component::Nor do
|
|
69
61
|
it '= false' do
|
70
62
|
subject.tick
|
71
63
|
subject.tock
|
72
|
-
expect(subject
|
64
|
+
expect(subject.out.get).to eq false
|
73
65
|
end
|
74
66
|
end
|
75
67
|
|
@@ -79,7 +71,7 @@ describe Circuits::Component::Nor do
|
|
79
71
|
it '= true' do
|
80
72
|
subject.tick
|
81
73
|
subject.tock
|
82
|
-
expect(subject
|
74
|
+
expect(subject.out.get).to eq true
|
83
75
|
end
|
84
76
|
end
|
85
77
|
|
@@ -95,7 +87,7 @@ describe Circuits::Component::Nor do
|
|
95
87
|
it '= false' do
|
96
88
|
subject.tick
|
97
89
|
subject.tock
|
98
|
-
expect(subject
|
90
|
+
expect(subject.out.get).to eq false
|
99
91
|
end
|
100
92
|
end
|
101
93
|
end
|
@@ -5,25 +5,21 @@ describe Circuits::Component::Not do
|
|
5
5
|
describe '#tick' do
|
6
6
|
subject { Circuits::Component::Not.new }
|
7
7
|
|
8
|
-
before { subject[:in].set input }
|
9
|
-
|
10
8
|
context '!false' do
|
11
|
-
let(:input) { false }
|
12
|
-
|
13
9
|
it '= true' do
|
10
|
+
subject.in.set false
|
14
11
|
subject.tick
|
15
12
|
subject.tock
|
16
|
-
expect(subject
|
13
|
+
expect(subject.out.get).to eq true
|
17
14
|
end
|
18
15
|
end
|
19
16
|
|
20
17
|
context '!true' do
|
21
|
-
let(:input) { true }
|
22
|
-
|
23
18
|
it '= false' do
|
19
|
+
subject.in.set true
|
24
20
|
subject.tick
|
25
21
|
subject.tock
|
26
|
-
expect(subject
|
22
|
+
expect(subject.out.get).to eq false
|
27
23
|
end
|
28
24
|
end
|
29
25
|
end
|
@@ -6,55 +6,47 @@ describe Circuits::Component::Or do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::Or.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= false' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq false
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= true' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq true
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= true' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq true
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= true' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq true
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
49
|
+
|
58
50
|
[3, 4, 8].each do |n|
|
59
51
|
context "with #{n} inputs" do
|
60
52
|
subject { Circuits::Component::Or.new input_count: n }
|
@@ -69,7 +61,7 @@ describe Circuits::Component::Or do
|
|
69
61
|
it '= true' do
|
70
62
|
subject.tick
|
71
63
|
subject.tock
|
72
|
-
expect(subject
|
64
|
+
expect(subject.out.get).to eq true
|
73
65
|
end
|
74
66
|
end
|
75
67
|
|
@@ -79,7 +71,7 @@ describe Circuits::Component::Or do
|
|
79
71
|
it '= false' do
|
80
72
|
subject.tick
|
81
73
|
subject.tock
|
82
|
-
expect(subject
|
74
|
+
expect(subject.out.get).to eq false
|
83
75
|
end
|
84
76
|
end
|
85
77
|
|
@@ -95,7 +87,7 @@ describe Circuits::Component::Or do
|
|
95
87
|
it '= true' do
|
96
88
|
subject.tick
|
97
89
|
subject.tock
|
98
|
-
expect(subject
|
90
|
+
expect(subject.out.get).to eq true
|
99
91
|
end
|
100
92
|
end
|
101
93
|
end
|
@@ -7,15 +7,15 @@ describe Circuits::Component::SrNand do
|
|
7
7
|
|
8
8
|
context 'it has just been initialized' do
|
9
9
|
it 'is unset' do
|
10
|
-
expect(subject[:q].get).to eq
|
11
|
-
expect(subject[:not_q].get).to eq
|
10
|
+
expect(subject[:q].get).to eq false
|
11
|
+
expect(subject[:not_q].get).to eq true
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'is stable' do
|
15
15
|
subject.tick
|
16
16
|
subject.tock
|
17
|
-
expect(subject[:q].get).to eq
|
18
|
-
expect(subject[:not_q].get).to eq
|
17
|
+
expect(subject[:q].get).to eq false
|
18
|
+
expect(subject[:not_q].get).to eq true
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -29,23 +29,23 @@ describe Circuits::Component::SrNand do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'is set' do
|
32
|
-
expect(subject[:q].get).to eq
|
33
|
-
expect(subject[:not_q].get).to eq
|
32
|
+
expect(subject[:q].get).to eq true
|
33
|
+
expect(subject[:not_q].get).to eq false
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'is stable' do
|
37
37
|
subject.tick
|
38
38
|
subject.tock
|
39
|
-
expect(subject[:q].get).to eq
|
40
|
-
expect(subject[:not_q].get).to eq
|
39
|
+
expect(subject[:q].get).to eq true
|
40
|
+
expect(subject[:not_q].get).to eq false
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'can be reset' do
|
44
44
|
subject[:not_r].set false
|
45
45
|
subject.tick
|
46
46
|
subject.tock
|
47
|
-
expect(subject[:q].get).to eq
|
48
|
-
expect(subject[:not_q].get).to eq
|
47
|
+
expect(subject[:q].get).to eq false
|
48
|
+
expect(subject[:not_q].get).to eq true
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -59,23 +59,23 @@ describe Circuits::Component::SrNand do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'is reset' do
|
62
|
-
expect(subject[:q].get).to eq
|
63
|
-
expect(subject[:not_q].get).to eq
|
62
|
+
expect(subject[:q].get).to eq false
|
63
|
+
expect(subject[:not_q].get).to eq true
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'is stable' do
|
67
67
|
subject.tick
|
68
68
|
subject.tock
|
69
|
-
expect(subject[:q].get).to eq
|
70
|
-
expect(subject[:not_q].get).to eq
|
69
|
+
expect(subject[:q].get).to eq false
|
70
|
+
expect(subject[:not_q].get).to eq true
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'can be set' do
|
74
74
|
subject[:not_s].set false
|
75
75
|
subject.tick
|
76
76
|
subject.tock
|
77
|
-
expect(subject[:q].get).to eq
|
78
|
-
expect(subject[:not_q].get).to eq
|
77
|
+
expect(subject[:q].get).to eq true
|
78
|
+
expect(subject[:not_q].get).to eq false
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
@@ -7,15 +7,15 @@ describe Circuits::Component::SrNor do
|
|
7
7
|
|
8
8
|
context 'it has just been initialized' do
|
9
9
|
it 'is unset' do
|
10
|
-
expect(subject[:q].get).to eq
|
11
|
-
expect(subject[:not_q].get).to eq
|
10
|
+
expect(subject[:q].get).to eq false
|
11
|
+
expect(subject[:not_q].get).to eq true
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'is stable' do
|
15
15
|
subject.tick
|
16
16
|
subject.tock
|
17
|
-
expect(subject[:q].get).to eq
|
18
|
-
expect(subject[:not_q].get).to eq
|
17
|
+
expect(subject[:q].get).to eq false
|
18
|
+
expect(subject[:not_q].get).to eq true
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -29,23 +29,23 @@ describe Circuits::Component::SrNor do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'is set' do
|
32
|
-
expect(subject[:q].get).to eq
|
33
|
-
expect(subject[:not_q].get).to eq
|
32
|
+
expect(subject[:q].get).to eq true
|
33
|
+
expect(subject[:not_q].get).to eq false
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'is stable' do
|
37
37
|
subject.tick
|
38
38
|
subject.tock
|
39
|
-
expect(subject[:q].get).to eq
|
40
|
-
expect(subject[:not_q].get).to eq
|
39
|
+
expect(subject[:q].get).to eq true
|
40
|
+
expect(subject[:not_q].get).to eq false
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'can be reset' do
|
44
44
|
subject[:r].set true
|
45
45
|
subject.tick
|
46
46
|
subject.tock
|
47
|
-
expect(subject[:q].get).to eq
|
48
|
-
expect(subject[:not_q].get).to eq
|
47
|
+
expect(subject[:q].get).to eq false
|
48
|
+
expect(subject[:not_q].get).to eq true
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -59,23 +59,23 @@ describe Circuits::Component::SrNor do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'is reset' do
|
62
|
-
expect(subject[:q].get).to eq
|
63
|
-
expect(subject[:not_q].get).to eq
|
62
|
+
expect(subject[:q].get).to eq false
|
63
|
+
expect(subject[:not_q].get).to eq true
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'is stable' do
|
67
67
|
subject.tick
|
68
68
|
subject.tock
|
69
|
-
expect(subject[:q].get).to eq
|
70
|
-
expect(subject[:not_q].get).to eq
|
69
|
+
expect(subject[:q].get).to eq false
|
70
|
+
expect(subject[:not_q].get).to eq true
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'can be set' do
|
74
74
|
subject[:s].set true
|
75
75
|
subject.tick
|
76
76
|
subject.tock
|
77
|
-
expect(subject[:q].get).to eq
|
78
|
-
expect(subject[:not_q].get).to eq
|
77
|
+
expect(subject[:q].get).to eq true
|
78
|
+
expect(subject[:not_q].get).to eq false
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
@@ -6,55 +6,47 @@ describe Circuits::Component::Xnor do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::Xnor.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= true' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq true
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= false' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq false
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= false' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq false
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= true' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq true
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
49
|
+
|
58
50
|
context 'when the number of inputs is even' do
|
59
51
|
[2, 4, 8].each do |n|
|
60
52
|
context "with #{n} inputs" do
|
@@ -70,7 +62,7 @@ describe Circuits::Component::Xnor do
|
|
70
62
|
it '= true' do
|
71
63
|
subject.tick
|
72
64
|
subject.tock
|
73
|
-
expect(subject
|
65
|
+
expect(subject.out.get).to eq true
|
74
66
|
end
|
75
67
|
end
|
76
68
|
|
@@ -80,7 +72,7 @@ describe Circuits::Component::Xnor do
|
|
80
72
|
it '= true' do
|
81
73
|
subject.tick
|
82
74
|
subject.tock
|
83
|
-
expect(subject
|
75
|
+
expect(subject.out.get).to eq true
|
84
76
|
end
|
85
77
|
end
|
86
78
|
|
@@ -96,7 +88,7 @@ describe Circuits::Component::Xnor do
|
|
96
88
|
it '= false' do
|
97
89
|
subject.tick
|
98
90
|
subject.tock
|
99
|
-
expect(subject
|
91
|
+
expect(subject.out.get).to eq false
|
100
92
|
end
|
101
93
|
end
|
102
94
|
end
|
@@ -119,7 +111,7 @@ describe Circuits::Component::Xnor do
|
|
119
111
|
it '= false' do
|
120
112
|
subject.tick
|
121
113
|
subject.tock
|
122
|
-
expect(subject
|
114
|
+
expect(subject.out.get).to eq false
|
123
115
|
end
|
124
116
|
end
|
125
117
|
|
@@ -129,7 +121,7 @@ describe Circuits::Component::Xnor do
|
|
129
121
|
it '= true' do
|
130
122
|
subject.tick
|
131
123
|
subject.tock
|
132
|
-
expect(subject
|
124
|
+
expect(subject.out.get).to eq true
|
133
125
|
end
|
134
126
|
end
|
135
127
|
|
@@ -145,7 +137,7 @@ describe Circuits::Component::Xnor do
|
|
145
137
|
it '= true' do
|
146
138
|
subject.tick
|
147
139
|
subject.tock
|
148
|
-
expect(subject
|
140
|
+
expect(subject.out.get).to eq true
|
149
141
|
end
|
150
142
|
end
|
151
143
|
end
|
@@ -163,7 +155,7 @@ describe Circuits::Component::Xnor do
|
|
163
155
|
it '= false' do
|
164
156
|
subject.tick
|
165
157
|
subject.tock
|
166
|
-
expect(subject
|
158
|
+
expect(subject.out.get).to eq false
|
167
159
|
end
|
168
160
|
end
|
169
161
|
end
|
@@ -6,55 +6,47 @@ describe Circuits::Component::Xor do
|
|
6
6
|
context 'default input count' do
|
7
7
|
subject { Circuits::Component::Xor.new }
|
8
8
|
|
9
|
-
before do
|
10
|
-
subject[:a].set input_1
|
11
|
-
subject[:b].set input_2
|
12
|
-
end
|
13
|
-
|
14
9
|
context 'false + false' do
|
15
|
-
let(:input_1) { false }
|
16
|
-
let(:input_2) { false }
|
17
|
-
|
18
10
|
it '= false' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
19
13
|
subject.tick
|
20
14
|
subject.tock
|
21
|
-
expect(subject
|
15
|
+
expect(subject.out.get).to eq false
|
22
16
|
end
|
23
17
|
end
|
24
18
|
|
25
19
|
context 'true + false' do
|
26
|
-
let(:input_1) { true }
|
27
|
-
let(:input_2) { false }
|
28
|
-
|
29
20
|
it '= true' do
|
21
|
+
subject.a.set true
|
22
|
+
subject.b.set false
|
30
23
|
subject.tick
|
31
24
|
subject.tock
|
32
|
-
expect(subject
|
25
|
+
expect(subject.out.get).to eq true
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
36
29
|
context 'false + true' do
|
37
|
-
let(:input_1) { false }
|
38
|
-
let(:input_2) { true }
|
39
|
-
|
40
30
|
it '= true' do
|
31
|
+
subject.a.set false
|
32
|
+
subject.b.set true
|
41
33
|
subject.tick
|
42
34
|
subject.tock
|
43
|
-
expect(subject
|
35
|
+
expect(subject.out.get).to eq true
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
47
39
|
context 'true + true' do
|
48
|
-
let(:input_1) { true }
|
49
|
-
let(:input_2) { true }
|
50
|
-
|
51
40
|
it '= false' do
|
41
|
+
subject.a.set true
|
42
|
+
subject.b.set true
|
52
43
|
subject.tick
|
53
44
|
subject.tock
|
54
|
-
expect(subject
|
45
|
+
expect(subject.out.get).to eq false
|
55
46
|
end
|
56
47
|
end
|
57
48
|
end
|
49
|
+
|
58
50
|
context 'when the number of inputs is even' do
|
59
51
|
[2, 4, 8].each do |n|
|
60
52
|
context "with #{n} inputs" do
|
@@ -70,7 +62,7 @@ describe Circuits::Component::Xor do
|
|
70
62
|
it '= false' do
|
71
63
|
subject.tick
|
72
64
|
subject.tock
|
73
|
-
expect(subject
|
65
|
+
expect(subject.out.get).to eq false
|
74
66
|
end
|
75
67
|
end
|
76
68
|
|
@@ -80,7 +72,7 @@ describe Circuits::Component::Xor do
|
|
80
72
|
it '= false' do
|
81
73
|
subject.tick
|
82
74
|
subject.tock
|
83
|
-
expect(subject
|
75
|
+
expect(subject.out.get).to eq false
|
84
76
|
end
|
85
77
|
end
|
86
78
|
|
@@ -96,7 +88,7 @@ describe Circuits::Component::Xor do
|
|
96
88
|
it '= true' do
|
97
89
|
subject.tick
|
98
90
|
subject.tock
|
99
|
-
expect(subject
|
91
|
+
expect(subject.out.get).to eq true
|
100
92
|
end
|
101
93
|
end
|
102
94
|
end
|
@@ -119,7 +111,7 @@ describe Circuits::Component::Xor do
|
|
119
111
|
it '= true' do
|
120
112
|
subject.tick
|
121
113
|
subject.tock
|
122
|
-
expect(subject
|
114
|
+
expect(subject.out.get).to eq true
|
123
115
|
end
|
124
116
|
end
|
125
117
|
|
@@ -129,7 +121,7 @@ describe Circuits::Component::Xor do
|
|
129
121
|
it '= false' do
|
130
122
|
subject.tick
|
131
123
|
subject.tock
|
132
|
-
expect(subject
|
124
|
+
expect(subject.out.get).to eq false
|
133
125
|
end
|
134
126
|
end
|
135
127
|
|
@@ -145,7 +137,7 @@ describe Circuits::Component::Xor do
|
|
145
137
|
it '= false' do
|
146
138
|
subject.tick
|
147
139
|
subject.tock
|
148
|
-
expect(subject
|
140
|
+
expect(subject.out.get).to eq false
|
149
141
|
end
|
150
142
|
end
|
151
143
|
end
|
@@ -163,7 +155,7 @@ describe Circuits::Component::Xor do
|
|
163
155
|
it '= true' do
|
164
156
|
subject.tick
|
165
157
|
subject.tock
|
166
|
-
expect(subject
|
158
|
+
expect(subject.out.get).to eq true
|
167
159
|
end
|
168
160
|
end
|
169
161
|
end
|