class Parameter
require_relative “.././axi4”
require_relative “./tdlerror” require_relative “./basefunc”
Constants
- OP_SYMBOLS
Attributes
ghost[RW]
id[RW]
name[RW]
type[RW]
value[RW]
vcs_string[RW]
Public Class Methods
new(name: "P",value:100,local:false,port:false,show:true,type:nil,belong_to_module: nil)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 9 def initialize(name: "P",value:100,local:false,port:false,show:true,type:nil,belong_to_module: nil) @name = name @local = local # @id = GlobalParam.CurrTdlModule.BindEleClassVars.Parameter.id @port = port @show = show @value = value @type = type @belong_to_module = belong_to_module unless @belong_to_module raise TdlError.new("Parameter<#{name}> dnot have belong_to_module") end end
parse_params(parameter_str) { |h| ... }
click to toggle source
parse text for autogen method and constant ###
# File lib/tdl/elements/parameter.rb, line 92 def self.parse_params(parameter_str) if parameter_str.nil? || parameter_str.strip.empty? return nil end params = [] parameter_str = parameter_str.gsub(/\/\/.*$/,'') if parameter_str && !parameter_str.strip.empty? params = parameter_str.split(/,\s*$/).map do |e| me = e.match(/(?<vcs>parameter|parameter_string|parameter_longstring)(\(\d+\))?\s*(\[.*?\]|\s+|real|bit|string|longint)\s*(?<name>\w+)\s*=\s*(?<value>.*)/) # me = e.match(/(?<vcs>parameter|parameter_string)\s*(\[.*?\]|\s+|real|bit|string|longint)\s*(?<name>\w+)\s*=\s*(?<value>.*)/) # me_value = me["value"].downcase next unless me me_value = me["value"] ex_me = e.match(/\(\*\s*show\s*=\s*"false"\s*\*\)/) if me && !ex_me h = Hash.new h[:type] = Parameter me_integer = me_value.match(/^\s*\d+\s*$/) me_mth0 = me_value.match(/["](?<str_name>.+?)["]/) me_mth3 = me_value.match(/\$clog2/) me_mth4 = me_value.match(/^[A-Z]([A-Z]|[0-9]|\+|-|\*|\/|%|_)+[A-Z0-9]$/) me_mth2 = me_value.match(/(?<bit_name>^\d+$|^\d+(=|-|\*|\/){1,2}\d+)/i) me_mth1 = me_value.match(/(?<bit_name>\d*'(h|d|b|sh|sd|sb)\w+|^\d+$|\d+(=|-|\*|\/){1,2}\d+)/i) me_mth5 = me_value.match(/\{.+\}/) if me_value h[:name] = me["name"].downcase h[:origin_name] = me["name"] if me_mth5 h[:value] = "NqString.new(\"#{me_value}\")" elsif me_integer h[:value] = me_value elsif me_mth0 h[:value] = '"'+me_mth0["str_name"]+'"' elsif me_mth2 h[:value] = me_mth1["bit_name"] elsif me_mth1 h[:value] = '"'+me_mth1["bit_name"]+'"' elsif me_mth3 h[:value] = "NqString.new('#{me_value}')" elsif me_mth4 h[:value] = "NqString.new('#{me_value}')" else h[:value] = '"'+me_value.strip+'"' end end h[:port_len] = h[:origin_name].length # h[:type] = Parameter h[:inst_ex_port] = lambda { |ml| if ml+4 >= h[:origin_name].length ll = ml+4 - h[:origin_name].length else ll = 1 end " .#{h[:origin_name]}"+" "*(ll)+"(\#{align_signal(#{h[:name]})})" } yield h h else nil end end end params.compact end
Public Instance Methods
[](a,b=nil)
click to toggle source
def signal
if @port "#{@name}" else "#{@name}_#{@id}" end
end
# File lib/tdl/elements/parameter.rb, line 40 def [](a,b=nil) if a.is_a? ClassHDL::OpertorChain a.slaver = true end if b.is_a? ClassHDL::OpertorChain b.slaver = true end if b sqstr = "[#{a.to_s}:#{b.to_s}]" else sqstr = "[#{a.to_s}]" end signal.concat sqstr end
always_times(&block)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 273 def always_times(&block) with_tap_id do str = times(pt_id,&block) GenInnerStr.new(str) end end
clog2()
click to toggle source
# File lib/tdl/elements/parameter.rb, line 193 def clog2 return "$clog2(#{signal})".to_nq end
cmod(x)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 197 def cmod(x) ## 返回最小整数使得 self 小于等于 x*rel return "#{signal}/#{x}+(#{signal}%#{x}!=0)".to_nq end
eql?(a)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 310 def eql?(a) if a.is_a? Parameter self.value.eql? a.value else self.value.eql? a end end
generator() { |"#{name}_KK".to_nq,tmp_sm| ... }
click to toggle source
# File lib/tdl/elements/parameter.rb, line 211 def generator(&block) with_tap_id do tmp_sm = GenBlockModule.new(name:"#{belong_to_module.module_name}_#{name}_generator_tmp_top_#{pg_id}",belong_to_module:belong_to_module) gstr = yield("#{name}_KK".to_nq,tmp_sm) # KK, str_collect str = "" if gstr.is_a? GenInnerStr str += gstr end str += (tmp_sm.instance_draw + tmp_sm.vars_exec_inst) # belong_to_module.Logic_inst << tmp_sm.vars_define_inst belong_to_module.Logic_draw << generator_block(str) end end
generator_times(&block)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 266 def generator_times(&block) # for .. for .. with_tap_id do str = times(pg_id,&block) GenInnerStr.new(str) end end
inst()
click to toggle source
# File lib/tdl/elements/parameter.rb, line 23 def inst return "" if @ghost unless @local "parameter #{@type.to_s} #{@name} = #{align_signal(@value)};" else "localparam #{@type.to_s} #{@name} = #{align_signal(@value)};" end end
inst_port(align_len = 7)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 61 def inst_port(align_len = 7) unless @show show_str = "//(* show = \"false\" *)\n " else show_str = "" end if @port unless vcs_string with_new_align(0) do show_str + ("parameter" + " #{@type.to_s} " + @name.to_s + " " + " "*align_len + "= #{align_signal(@value)}") end else with_new_align(0) do show_str + ("`parameter_longstring(#{vcs_string}) " + @name.to_s + " " + " "*align_len + "= #{align_signal(@value)}") end end end end
port_length()
click to toggle source
# File lib/tdl/elements/parameter.rb, line 57 def port_length ("parameter" + " #{@type.to_s} " + @name.to_s + " ").length end
real_data()
click to toggle source
# File lib/tdl/axi4/axi4_interconnect_verb.rb, line 5 def real_data @value end
Private Instance Methods
generator_block(str)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 230 def generator_block(str) " generate for(#{name}_KK=0;#{name}_KK<#{name};#{name}_KK++)begin:#{name}_GENERATOR_BLOCK_#{pg_id} #{str} end endgenerate " end
operation_tow(symb,a)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 176 def operation_tow(symb,a) # return NqString.new(align_signal(signal,q_mark=false).concat("#{symb}").concat(align_signal(a,q_mark=false))) # return NqString.new(signal.concat("#{symb}").concat(a.to_s)) unless a.instance_of? String rel = NqString.new(signal.concat("#{symb}").concat(a.to_s)) else rel = NqString.new(signal.concat("#{symb}").concat('"').concat(a.to_s)).concat('"') end new_op = ClassHDL::OpertorChain.new(nil,belong_to_module) new_op.tree.push([rel]) return new_op end
pg_id()
click to toggle source
# File lib/tdl/elements/parameter.rb, line 248 def pg_id @_pg_id ||= 0 belong_to_module.Logic_draw << "genvar #{name}_KK;\n" if @_pg_id.eql?(0) _tmp_id = @_pg_id @_pg_id += 1 _tmp_id end
times(tid) { |"#{name}_KK".to_nq,tmp_sm| ... }
click to toggle source
# File lib/tdl/elements/parameter.rb, line 282 def times(tid,&block) tmp_sm = GenBlockModule.new(name:"#{belong_to_module.module_name}_#{name}_generator_tmp_#{tid}",belong_to_module:belong_to_module) gstr = yield("#{name}_KK".to_nq,tmp_sm) # KK, str_collect str = "" if gstr.is_a? GenInnerStr str += gstr end str += (tmp_sm.instance_draw + tmp_sm.vars_exec_inst) # belong_to_module.Logic_inst << tmp_sm.vars_define_inst rel = times_draw(tid,str) end
times_draw(tid,str)
click to toggle source
# File lib/tdl/elements/parameter.rb, line 300 def times_draw(tid,str) "#{' '*$generate_tap_igt}for(#{name}_KK=0;#{name}_KK<#{name};#{name}_KK++)begin:#{name}_GENERATOR_BLOCK_#{tid} #{' '*$generate_tap_igt}#{str} #{' '*$generate_tap_igt}end" end
times_id()
click to toggle source
# File lib/tdl/elements/parameter.rb, line 256 def times_id @_pt_id ||= 0 belong_to_module.Logic_draw << "int #{name}_KK;\n" if @_pt_id.eql?(0) _tmp_id = @_pt_id @_pt_id += 1 _tmp_id end
with_tap_id() { || ... }
click to toggle source
# File lib/tdl/elements/parameter.rb, line 241 def with_tap_id(&block) $generate_tap_igt += 1 str = yield $generate_tap_igt -= 1 str end