Module: RubyHDL::High
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Defined Under Namespace
Modules: SEnumerable Classes: Binary, Expression, Ref, RefIndex, RefName, RefRange, Ruby, Sblock, SblockTop, Sbreak, Scontinue, Select, SequencerT, Sif, SignalI, Siter, Sloop, Step, Sterminate, Swhile, Sync, Transmit, Type, TypeDef, TypeFloat, TypeGen, TypeSigned, TypeStruct, TypeTuple, TypeUnsigned, TypeVector, Unary, Value
Constant Summary collapse
- SBLOCK_STACK =
The stack of SW blocks.
[ SblockTop.new ]
- RUBY_OPERATOR =
The translation of operators into ruby code.
{ # Unary operators. :"-@" => "-(%s)", :"+@" => "+(%s)", :"~" => "~(%s)", :abs => "(%s).abs", :boolean => "%s", :bit => "%s", :signed => "%s", :unsigned => "(%s) & 0xFFFFFFFFFFFFFFFF", # Binary operators. :"+" => "(%s)+(%s)", :"-" => "(%s)-(%s)", :"*" => "(%s)*(%s)", :"/" => "(%s)/(%s)", :"%" => "(%s)%%(%s)", :"**" => "(%s)**(%s)", :"&" => "(%s)&(%s)", :"|" => "(%s)|(%s)", :"^" => "(%s)^(%s)", :"<<" => "(%s)<<(%s)", :">>" => "(%s)>>(%s)", :"==" => "(%s)==(%s)", :"!=" => "(%s)!=(%s)", :"<" => "(%s)<(%s)", :">" => "(%s)>(%s)", :"<=" => "(%s)<=(%s)",:">=" => "(%s)>=(%s)" }
- Void =
The void type
define_type(:void)
- Bit =
The bit type.
define_type(:bit)
- Signed =
The signed bit type.
define_type(:signed)
- Unsigned =
The unsigned bit type.
define_type(:unsigned)
- Float =
The float bit type
define_type(:float)
- StringT =
The string type
define_type(:string)
- @@absoluteCounter =
The absolute name counter.
-1 # The absolute name counter.
- @@uniq_names =
Set.new(Symbol.all_symbols.map {|sym| sym.to_s})
Class Method Summary collapse
-
.call_sblock(m, *args, &ruby_block) ⇒ Object
Calling a method from the stack.
-
.define_type(name) ⇒ Object
Defines a basic type +name+.
- .global_sblock ⇒ Object
- .pop_sblock ⇒ Object
- .push_sblock(sblock) ⇒ Object
- .top_sblock ⇒ Object
-
.uniq_name(base = "") ⇒ Object
Generates an absolute uniq name.
Instance Method Summary collapse
-
#senumerator(typ, size = nil, &access) ⇒ Object
Creates an sequencer enumerator using a specific block access.
-
#sequencer(clk = nil, start = nil, &ruby_block) ⇒ Object
Create a new sequencer block, with clock counter +clk+ and run control +start+.
-
#struct(content) ⇒ Object
Creates an unnamed structure type from a +content+.
-
#typedef(name, &ruby_block) ⇒ Object
Declares a high-level generic type named +name+, and using +ruby_block+ for construction.
Class Method Details
.call_sblock(m, *args, &ruby_block) ⇒ Object
Calling a method from the stack.
119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 119 def self.call_sblock(m,*args,&ruby_block) SBLOCK_STACK.reverse_each do |sblock| if sblock.callable?(m) then # return sblock.callable(m,*args,&ruby_block) res = sblock.callable(m,*args,&ruby_block) return res end end # Method not found. method_missing(m,*args,&ruby_block) end |
.define_type(name) ⇒ Object
Defines a basic type +name+.
908 909 910 911 912 913 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 908 def self.define_type(name) name = name.to_sym type = Type.new(name) self.send(:define_method,name) { type } return type end |
.global_sblock ⇒ Object
102 103 104 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 102 def self.global_sblock SBLOCK_STACK[0] end |
.pop_sblock ⇒ Object
114 115 116 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 114 def self.pop_sblock SBLOCK_STACK.pop end |
.push_sblock(sblock) ⇒ Object
110 111 112 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 110 def self.push_sblock(sblock) SBLOCK_STACK << sblock end |
.top_sblock ⇒ Object
106 107 108 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 106 def self.top_sblock SBLOCK_STACK[-1] end |
.uniq_name(base = "") ⇒ Object
Generates an absolute uniq name.
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 21 def self.uniq_name(base = "") @@absoluteCounter += 1 name = base.to_s + ":#{@@absoluteCounter}" if @@uniq_names.include?(name) then # The symbol exists, try again. return self.uniq_name else @@uniq_names.add(name) return name.to_sym end end |
Instance Method Details
#senumerator(typ, size = nil, &access) ⇒ Object
Creates an sequencer enumerator using a specific block access.
- +typ+ is the data type of the elements.
- +size+ is the number of elements, nil if not relevant.
- +access+ is the block implementing the access method. def senumerator(typ,size,&access)
2814 2815 2816 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 2814 def senumerator(typ,size = nil,&access) return SEnumeratorBase.new(typ,size,&access) end |
#sequencer(clk = nil, start = nil, &ruby_block) ⇒ Object
Create a new sequencer block, with clock counter +clk+ and run control +start+
2805 2806 2807 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 2805 def sequencer(clk = nil, start = nil, &ruby_block) return SequencerT.new(clk,start,&ruby_block) end |
#struct(content) ⇒ Object
Creates an unnamed structure type from a +content+.
1511 1512 1513 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1511 def struct(content) return TypeStruct.new(:"",:little,content) end |
#typedef(name, &ruby_block) ⇒ Object
Declares a high-level generic type named +name+, and using +ruby_block+ for construction.
1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1519 def typedef(name, &ruby_block) # Ensure there is a block. ruby_block = proc {} unless block_given? type = TypeGen.new(name,&ruby_block) define_singleton_method(name.to_sym) do |*args| if (args.size < ruby_block.arity) then # Not enough arguments get generic type as is. type else # There are arguments, specialize the type. gtype = type.generate(*args) # And add it as a local type of the system. RubyHDL::High.top_sblock.add_type(gtype) gtype end end end |