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, Scall, Scontinue, Select, SequencerT, SfunctionT, Sif, SignalI, Siter, Sloop, Sreturn, Statement, 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. :"-@" => "-(%{l})", :"+@" => "+(%{l})", :"~" => "~(%{l})", :abs => "(%{l}).abs", :boolean => "%{l}", :bit => "%{l}", :signed => "%{l}", :unsigned => "(%{l}) & 0xFFFFFFFFFFFFFFFF", # Binary operators. :"+" => "(%{l})+(%{r})", :"-" => "(%{l})-(%{r})", :"*" => "(%{l})*(%{r})", :"/" => "(%{l})/(%{r})", :"%" => "(%{l})%%(%{r})", :"**" => "(%{l})**(%{r})", :"&" => "(%{l})&(%{r})", :"|" => "(%{l})|(%{r})", :"^" => "(%{l})^(%{r})", :"<<" => "(%{l})<<(%{r})", :">>" => "(%{l})>>(%{r})", :"==" => "((%{l}) & %{m}==(%{r}) & %{m}) ? 1:0", :"!=" => "((%{l}) & %{m}!=(%{r}) & %{m}) ? 1:0", :"<" => "((%{l}) & %{m}%{s} < (%{r}) & %{m}%{s}) ? 1:0", :">" => "((%{l}) & %{m}%{s} > (%{r}) & %{m}%{s}) ? 1:0", :"<=" => "((%{l}) & %{m}%{s} <=(%{r}) & %{m}%{s}) ? 1:0", :">=" => "((%{l}) & %{m}%{s} >=(%{r}) & %{m}%{s}) ? 1:0" }
- C_OPERATOR =
The translation of operators into C 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)", :"**" => "pow((%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
-
#inner(*names) ⇒ Object
Create a 1-bit inner signal.
-
#input(*names) ⇒ Object
Create a 1-bit input signal.
-
#output(*names) ⇒ Object
Create a 1-bit output signal.
-
#sdef(name, &ruby_block) ⇒ Object
Create a new function named +name+, built using block +ruby_block+.
-
#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.
161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 161 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+.
1051 1052 1053 1054 1055 1056 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1051 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
144 145 146 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 144 def self.global_sblock SBLOCK_STACK[0] end |
.pop_sblock ⇒ Object
156 157 158 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 156 def self.pop_sblock SBLOCK_STACK.pop end |
.push_sblock(sblock) ⇒ Object
152 153 154 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 152 def self.push_sblock(sblock) SBLOCK_STACK << sblock end |
.top_sblock ⇒ Object
148 149 150 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 148 def self.top_sblock SBLOCK_STACK[-1] end |
.uniq_name(base = "") ⇒ Object
Generates an absolute uniq name.
25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 25 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
#inner(*names) ⇒ Object
Create a 1-bit inner signal.
3871 3872 3873 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3871 def inner(*names) return [1].inner(*names) end |
#input(*names) ⇒ Object
Create a 1-bit input signal.
3861 3862 3863 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3861 def input(*names) return [1].input(*names) end |
#output(*names) ⇒ Object
Create a 1-bit output signal.
3866 3867 3868 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3866 def output(*names) return [1].output(*names) end |
#sdef(name, &ruby_block) ⇒ Object
Create a new function named +name+, built using block +ruby_block+.
3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3876 def sdef(name,&ruby_block) name = name.to_sym # Get the arguments of the ruby_block. block_args = ruby_block.parameters.map {|typ,name| name.to_s } # Create function. cur_sblock = RubyHDL::High.top_sblock # Register the call. cur_sblock.register(name.to_sym) do |*args| # Create the function. # Get the current sequencer. cur_seq = RubyHDL::High.top_sblock.sequencer # Get the function from the sequencer if any. function = cur_seq.sfunction(name) unless function then # There were no function for the sequencer, create it. # Execute the ruby block in a sequencer environment for building # the sblock. sblock = Sblock.new(cur_seq,&ruby_block) # Create the arguments. block_args.each_with_index do |block_arg,i| # puts "args[#{i}]=(#{args[i].name},#{args[i].type})" sblock.make_inners(args[i].type,block_arg.to_sym) end # Create the function. function = SfunctionT.new(name,sblock,*block_args) # Add it to the current sequencer. cur_seq.add_sfunction(name,function) end # And create the call Scall.new(function,cur_seq,*args) end end |
#sequencer(clk = nil, start = nil, &ruby_block) ⇒ Object
Create a new sequencer block, with clock counter +clk+ and run control +start+
3854 3855 3856 3857 3858 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3854 def sequencer(clk = nil, start = nil, &ruby_block) # Ensure the clock is global. clk.global! if clk return SequencerT.new(clk,start,&ruby_block) end |
#struct(content) ⇒ Object
Creates an unnamed structure type from a +content+.
1696 1697 1698 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1696 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.
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1704 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 |