Start work on Port class
This commit is contained in:
parent
2e6f016099
commit
bfe66a20e4
83
port.rb
Normal file
83
port.rb
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
## Represents an IO port of a device
|
||||||
|
|
||||||
|
class Port
|
||||||
|
include Comparable
|
||||||
|
|
||||||
|
# @!attribute [r] val
|
||||||
|
# @return [Integer] the current value of the port
|
||||||
|
attr_reader :val
|
||||||
|
|
||||||
|
# Returns a new instance of Port
|
||||||
|
# @param name [String] The string name of the port
|
||||||
|
def initialize(name="")
|
||||||
|
@connected=[]
|
||||||
|
@propagating=false
|
||||||
|
@val=0
|
||||||
|
@strname=name
|
||||||
|
end
|
||||||
|
|
||||||
|
# Sets the port's value
|
||||||
|
# @param val [Integer] The new value for the port
|
||||||
|
# @return [void]
|
||||||
|
def setval(val)
|
||||||
|
# Prevent infinite loops when the connected port calls back when propagating.
|
||||||
|
if !@propagating
|
||||||
|
@val=val
|
||||||
|
@propagating=true
|
||||||
|
propagate()
|
||||||
|
@propagating=false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Connects this port to another port
|
||||||
|
# @param port [Port] The port to connect to
|
||||||
|
# @return [void]
|
||||||
|
def connect(port)
|
||||||
|
@connected.push port
|
||||||
|
port.connect_back(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a string representation for debugging
|
||||||
|
# @return [String] String name of the port, or super if none
|
||||||
|
def to_s()
|
||||||
|
return super if @strname==""
|
||||||
|
return @strname
|
||||||
|
end
|
||||||
|
|
||||||
|
# Method for Comparable module to use for comparasions.
|
||||||
|
# @param obj [Object] Object to compare to
|
||||||
|
# @return [void]
|
||||||
|
def <=>(obj)
|
||||||
|
if obj.class==Port
|
||||||
|
return @val<=>obj.val
|
||||||
|
elsif obj.is_a? Integer
|
||||||
|
return @val<=>obj
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Used by connect when setting up bidirectional connection.
|
||||||
|
# @api private
|
||||||
|
# @param (see #connect)
|
||||||
|
# @return [void]
|
||||||
|
def connect_back(port)
|
||||||
|
@connected.push port
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Propagates the value to all connected ports
|
||||||
|
# @return [void]
|
||||||
|
def propagate()
|
||||||
|
@connected.each do |port|
|
||||||
|
port.setval(@val)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
a=Port.new("a")
|
||||||
|
b=Port.new("b")
|
||||||
|
c=Port.new("c")
|
||||||
|
a.connect(b)
|
||||||
|
b.connect(c)
|
||||||
|
a.setval(10)
|
39
spec/port_spec.rb
Normal file
39
spec/port_spec.rb
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
require_relative "../port.rb"
|
||||||
|
|
||||||
|
describe Port do
|
||||||
|
it "should set the port's value when we call setval" do
|
||||||
|
a=Port.new
|
||||||
|
a.setval(1)
|
||||||
|
expect(a).to eq 1
|
||||||
|
end
|
||||||
|
it "should propagate values when we call setval" do
|
||||||
|
a=Port.new
|
||||||
|
b=Port.new
|
||||||
|
c=Port.new
|
||||||
|
d=Port.new
|
||||||
|
|
||||||
|
#connect A-B and C-D
|
||||||
|
a.connect(b)
|
||||||
|
c.connect(d)
|
||||||
|
|
||||||
|
a.setval(1)
|
||||||
|
c.setval(2)
|
||||||
|
expect(a).to eq 1
|
||||||
|
expect(b).to eq 1
|
||||||
|
expect(c).to eq 2
|
||||||
|
expect(d).to eq 2
|
||||||
|
|
||||||
|
#connect them all together
|
||||||
|
b.connect(c)
|
||||||
|
a.setval(3)
|
||||||
|
expect(a).to eq 3
|
||||||
|
expect(b).to eq 3
|
||||||
|
expect(c).to eq 3
|
||||||
|
expect(d).to eq 3
|
||||||
|
d.setval(4)
|
||||||
|
expect(a).to eq 4
|
||||||
|
expect(b).to eq 4
|
||||||
|
expect(c).to eq 4
|
||||||
|
expect(d).to eq 4
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user