circuits 0.11.1 → 0.11.2
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTYwYmM0YTZmMjVmMzQxZWU5M2Y0ZTUxNjAwNWVlM2U4NDVjOTA0YQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OGQ3ZTMzMjA4ODdiMTZiOGY1YzQ4YTE5ZjUyMWY5MTZlODhiOGI5Nw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTliMmUwNWJlZjg0MGZjYjFkZDlkMzdjODgwOWRjMmUxZWU5NDBmYjU4MWNi
|
10
|
+
ZjJmOWUwMWViZDVmZmY0ODhmZjg5ODVkMDE1MTcyMzM1NzY4N2FjNzRhNWU0
|
11
|
+
Nzg0YWNjOTI3ZWRjMGI1MTg0NTY1MTMwZWE2YTE2NDdjNzM3YjA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Y2I5ZWNiM2EwMWQ1YWQxNGRhOWI4ZTQ4YjMyMjE1MTQwNjRkYzAxNDg1YWJl
|
14
|
+
ZWViZTc0OTBiNmU0ZGYwMmRkZjk1YjU3MDEyMTA5MTc4M2RmN2QzYTIxNmFh
|
15
|
+
MjljODNkZjAzZTJiMWNmZDJjM2I2NDU5NzY3NGQ2MWI5YzkxMWE=
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'circuits/component/base'
|
2
|
+
require 'circuits/component/and'
|
3
|
+
require 'circuits/component/or'
|
4
|
+
require 'circuits/component/xor'
|
5
|
+
|
6
|
+
module Circuits
|
7
|
+
module Component
|
8
|
+
# Full 1-bit Adder
|
9
|
+
class FullAdder < Base
|
10
|
+
def initialize
|
11
|
+
sub_components = create_sub_components
|
12
|
+
super(inputs: [:a, :b, :c_in],
|
13
|
+
outputs: [:s, :c_out],
|
14
|
+
sub_components: sub_components.map { |_, v| v },
|
15
|
+
ticks: 3)
|
16
|
+
link sub_components
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def create_sub_components
|
22
|
+
{
|
23
|
+
and_in: And.new,
|
24
|
+
and_carry: And.new,
|
25
|
+
or_gate: Or.new,
|
26
|
+
xor_in: Xor.new,
|
27
|
+
xor_out: Xor.new
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def link(sub_components)
|
32
|
+
link_and_in sub_components
|
33
|
+
link_and_carry sub_components
|
34
|
+
link_or_gate sub_components
|
35
|
+
link_xor_in sub_components
|
36
|
+
link_xor_out sub_components
|
37
|
+
link_outputs sub_components
|
38
|
+
end
|
39
|
+
|
40
|
+
def link_and_in(sub_components)
|
41
|
+
sub_components[:and_in].a.set a
|
42
|
+
sub_components[:and_in].b.set b
|
43
|
+
end
|
44
|
+
|
45
|
+
def link_and_carry(sub_components)
|
46
|
+
sub_components[:and_carry].a.set sub_components[:xor_in].out
|
47
|
+
sub_components[:and_carry].b.set c_in
|
48
|
+
end
|
49
|
+
|
50
|
+
def link_or_gate(sub_components)
|
51
|
+
sub_components[:or_gate].a.set sub_components[:and_in].out
|
52
|
+
sub_components[:or_gate].b.set sub_components[:and_carry].out
|
53
|
+
end
|
54
|
+
|
55
|
+
def link_xor_in(sub_components)
|
56
|
+
sub_components[:xor_in].a.set a
|
57
|
+
sub_components[:xor_in].b.set b
|
58
|
+
end
|
59
|
+
|
60
|
+
def link_xor_out(sub_components)
|
61
|
+
sub_components[:xor_out].a.set sub_components[:xor_in].out
|
62
|
+
sub_components[:xor_out].b.set c_in
|
63
|
+
end
|
64
|
+
|
65
|
+
def link_outputs(sub_components)
|
66
|
+
s.set sub_components[:xor_out].out
|
67
|
+
c_out.set sub_components[:or_gate].out
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'circuits/component/base'
|
2
|
+
require 'circuits/component/and'
|
3
|
+
require 'circuits/component/xor'
|
4
|
+
|
5
|
+
module Circuits
|
6
|
+
module Component
|
7
|
+
# Half 1-bit Adder
|
8
|
+
class HalfAdder < Base
|
9
|
+
def initialize
|
10
|
+
and_gate = And.new
|
11
|
+
xor_gate = Xor.new
|
12
|
+
super(inputs: 2,
|
13
|
+
outputs: [:s, :c],
|
14
|
+
sub_components: [and_gate, xor_gate],
|
15
|
+
ticks: 1)
|
16
|
+
link_internals and_gate, xor_gate
|
17
|
+
link_outputs and_gate, xor_gate
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def link_internals(and_gate, xor_gate)
|
23
|
+
and_gate.a.set a
|
24
|
+
and_gate.b.set b
|
25
|
+
xor_gate.a.set a
|
26
|
+
xor_gate.b.set b
|
27
|
+
end
|
28
|
+
|
29
|
+
def link_outputs(and_gate, xor_gate)
|
30
|
+
s.set xor_gate.out
|
31
|
+
c.set and_gate.out
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/circuits/version.rb
CHANGED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'circuits/component/full_adder'
|
3
|
+
|
4
|
+
describe Circuits::Component::FullAdder do
|
5
|
+
describe '#tick' do
|
6
|
+
subject { Circuits::Component::FullAdder.new }
|
7
|
+
|
8
|
+
context 'no overflow' do
|
9
|
+
context '0 + 0' do
|
10
|
+
it '= 0' do
|
11
|
+
subject.a.set false
|
12
|
+
subject.b.set false
|
13
|
+
subject.tick
|
14
|
+
subject.tock
|
15
|
+
expect(subject.s.get).to eq false
|
16
|
+
expect(subject.c_out.get).to eq false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context '0 + 1' do
|
21
|
+
it '= 1' do
|
22
|
+
subject.a.set false
|
23
|
+
subject.b.set true
|
24
|
+
subject.tick
|
25
|
+
subject.tock
|
26
|
+
expect(subject.s.get).to eq true
|
27
|
+
expect(subject.c_out.get).to eq false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context '1 + 0' do
|
32
|
+
it '= 1' do
|
33
|
+
subject.a.set true
|
34
|
+
subject.b.set false
|
35
|
+
subject.tick
|
36
|
+
subject.tock
|
37
|
+
expect(subject.s.get).to eq true
|
38
|
+
expect(subject.c_out.get).to eq false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context '1 + 1' do
|
43
|
+
it '= 10' do
|
44
|
+
subject.a.set true
|
45
|
+
subject.b.set true
|
46
|
+
subject.tick
|
47
|
+
subject.tock
|
48
|
+
expect(subject.s.get).to eq false
|
49
|
+
expect(subject.c_out.get).to eq true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'overflow' do
|
55
|
+
context '0 + 0 (+ 1)' do
|
56
|
+
it '= 1' do
|
57
|
+
subject.a.set false
|
58
|
+
subject.b.set false
|
59
|
+
subject.c_in.set true
|
60
|
+
subject.tick
|
61
|
+
subject.tock
|
62
|
+
expect(subject.s.get).to eq true
|
63
|
+
expect(subject.c_out.get).to eq false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context '0 + 1 (+ 1)' do
|
68
|
+
it '= 10' do
|
69
|
+
subject.a.set false
|
70
|
+
subject.b.set true
|
71
|
+
subject.c_in.set true
|
72
|
+
subject.tick
|
73
|
+
subject.tock
|
74
|
+
expect(subject.s.get).to eq false
|
75
|
+
expect(subject.c_out.get).to eq true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context '1 + 0 (+ 1)' do
|
80
|
+
it '= 10' do
|
81
|
+
subject.a.set true
|
82
|
+
subject.b.set false
|
83
|
+
subject.c_in.set true
|
84
|
+
subject.tick
|
85
|
+
subject.tock
|
86
|
+
expect(subject.s.get).to eq false
|
87
|
+
expect(subject.c_out.get).to eq true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context '1 + 1 (+ 1)' do
|
92
|
+
it '= 11' do
|
93
|
+
subject.a.set true
|
94
|
+
subject.b.set true
|
95
|
+
subject.c_in.set true
|
96
|
+
subject.tick
|
97
|
+
subject.tock
|
98
|
+
expect(subject.s.get).to eq true
|
99
|
+
expect(subject.c_out.get).to eq true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'circuits/component/half_adder'
|
3
|
+
|
4
|
+
describe Circuits::Component::HalfAdder do
|
5
|
+
describe '#tick' do
|
6
|
+
subject { Circuits::Component::HalfAdder.new }
|
7
|
+
|
8
|
+
context '0 + 0' do
|
9
|
+
it '= 0' do
|
10
|
+
subject.a.set false
|
11
|
+
subject.b.set false
|
12
|
+
subject.tick
|
13
|
+
subject.tock
|
14
|
+
expect(subject.s.get).to eq false
|
15
|
+
expect(subject.c.get).to eq false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context '0 + 1' do
|
20
|
+
it '= 1' do
|
21
|
+
subject.a.set false
|
22
|
+
subject.b.set true
|
23
|
+
subject.tick
|
24
|
+
subject.tock
|
25
|
+
expect(subject.s.get).to eq true
|
26
|
+
expect(subject.c.get).to eq false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context '1 + 0' do
|
31
|
+
it '= 1' do
|
32
|
+
subject.a.set true
|
33
|
+
subject.b.set false
|
34
|
+
subject.tick
|
35
|
+
subject.tock
|
36
|
+
expect(subject.s.get).to eq true
|
37
|
+
expect(subject.c.get).to eq false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context '1 + 1' do
|
42
|
+
it '= 10' do
|
43
|
+
subject.a.set true
|
44
|
+
subject.b.set true
|
45
|
+
subject.tick
|
46
|
+
subject.tock
|
47
|
+
expect(subject.s.get).to eq false
|
48
|
+
expect(subject.c.get).to eq true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circuits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henry Muru Paenga
|
@@ -127,6 +127,8 @@ files:
|
|
127
127
|
- lib/circuits/component/and.rb
|
128
128
|
- lib/circuits/component/base.rb
|
129
129
|
- lib/circuits/component/d.rb
|
130
|
+
- lib/circuits/component/full_adder.rb
|
131
|
+
- lib/circuits/component/half_adder.rb
|
130
132
|
- lib/circuits/component/nand.rb
|
131
133
|
- lib/circuits/component/nor.rb
|
132
134
|
- lib/circuits/component/not.rb
|
@@ -142,6 +144,8 @@ files:
|
|
142
144
|
- spec/unit/circuits/component/and_spec.rb
|
143
145
|
- spec/unit/circuits/component/base_spec.rb
|
144
146
|
- spec/unit/circuits/component/d_spec.rb
|
147
|
+
- spec/unit/circuits/component/full_adder_spec.rb
|
148
|
+
- spec/unit/circuits/component/half_adder_spec.rb
|
145
149
|
- spec/unit/circuits/component/nand_spec.rb
|
146
150
|
- spec/unit/circuits/component/nor_spec.rb
|
147
151
|
- spec/unit/circuits/component/not_spec.rb
|
@@ -181,6 +185,8 @@ test_files:
|
|
181
185
|
- spec/unit/circuits/component/and_spec.rb
|
182
186
|
- spec/unit/circuits/component/base_spec.rb
|
183
187
|
- spec/unit/circuits/component/d_spec.rb
|
188
|
+
- spec/unit/circuits/component/full_adder_spec.rb
|
189
|
+
- spec/unit/circuits/component/half_adder_spec.rb
|
184
190
|
- spec/unit/circuits/component/nand_spec.rb
|
185
191
|
- spec/unit/circuits/component/nor_spec.rb
|
186
192
|
- spec/unit/circuits/component/not_spec.rb
|