Module: RubyHDL::High
- Defined in:
- lib/HDLRuby/std/sequencer_sw.rb
Defined Under Namespace
Modules: SEnumerable Classes: Binary, Expression, Hif, Print, 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.
170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 170 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+.
1065 1066 1067 1068 1069 1070 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1065 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
153 154 155 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 153 def self.global_sblock SBLOCK_STACK[0] end |
.pop_sblock ⇒ Object
165 166 167 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 165 def self.pop_sblock SBLOCK_STACK.pop end |
.push_sblock(sblock) ⇒ Object
161 162 163 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 161 def self.push_sblock(sblock) SBLOCK_STACK << sblock end |
.top_sblock ⇒ Object
157 158 159 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 157 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.
3998 3999 4000 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3998 def inner(*names) return [1].inner(*names) end |
#input(*names) ⇒ Object
Create a 1-bit input signal.
3988 3989 3990 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3988 def input(*names) return [1].input(*names) end |
#output(*names) ⇒ Object
Create a 1-bit output signal.
3993 3994 3995 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3993 def output(*names) return [1].output(*names) end |
#sdef(name, &ruby_block) ⇒ Object
Create a new function named +name+, built using block +ruby_block+.
4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 4003 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+
3981 3982 3983 3984 3985 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 3981 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+.
1710 1711 1712 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1710 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.
1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 |
# File 'lib/HDLRuby/std/sequencer_sw.rb', line 1718 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 |