Start work on Port class

This commit is contained in:
pjht 2018-07-08 17:19:58 -05:00
parent 2e6f016099
commit bfe66a20e4
2 changed files with 122 additions and 0 deletions

83
port.rb Normal file
View 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
View 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