Class: CompositeCelltype
- Includes:
- CelltypePluginModule, PluginModule
- Defined in:
- lib/tecsgen/core/gen_xml.rb,
lib/tecsgen/core/componentobj.rb
Overview
< Nestable
Constant Summary collapse
- @@nest_stack_index =
- @name
-
str
- @global_name
-
str
- @cell_list_in_composite
-
NamedList Cell
- @cell_list::Array
- Cell
-
: cell of CompositeCelltype’s cell
- @export_name_list
-
NamedList : CompositeCelltypeJoin
- @port_list
-
CompositeCelltypeJoin[]
- @attr_list
-
CompositeCelltypeJoin[]
- @b_singleton
-
bool : ‘singleton’ specified
- @b_active
-
bool : ‘active’ specified
- @real_singleton
-
bool : has singleton cell in this composite celltype
- @real_active
-
bool : has active cell in this composite celltype
- @name_list
-
NamedList item: Decl (attribute), Port エクスポート定義
- @internal_allocator_list
- [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], …
- @generate
- Symbol, String, Plugin
-
[ PluginName, option, Plugin ] Plugin は生成後に追加される
- @generate_list
- [ Symbol, String, Plugin ], …
-
generate 文で追加された generate
-1
- @@nest_stack =
[]
- @@current_object =
nil
Class Method Summary collapse
- .end_of_parse ⇒ Object
-
.find(name) ⇒ Object
false : if not in celltype definition, nil : if not found in celltype.
- .has_attribute?(attr) ⇒ Boolean
- .new_attribute(attr) ⇒ Object
-
.new_cell_in_composite(cell) ⇒ Object
CompositeCelltype#new_cell_in_composite.
-
.new_join(export_name, internal_cell_name, internal_cell_elem_name, type) ⇒ Object
join.
- .new_port(port) ⇒ Object
- .pop ⇒ Object
- .push ⇒ Object
Instance Method Summary collapse
-
#create_reverse_require_join(cell) ⇒ Object
CompositeCelltype# 逆require の結合を生成する.
-
#end_of_parse ⇒ Object
CompositeCelltype#end_of_parse.
-
#expand(name, global_name, namespacePath, join_list, region, plugin, locale) ⇒ Object
CompositeCelltype# composite celltype の cell を展開 name:: string: Composite cell の名前 global_name:: string: Composite cell の global name (C 言語名) join_list:: NamedList : Composite cell に対する Join の NamedList RETURN: [ { name => cell }, [ cell, … ] ] 戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト.
- #find(name) ⇒ Object
-
#find_export(name) ⇒ Object
CompositeCelltype# export する CompositeCelltypeJoin を得る name:: string: attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない.
- #gen_XML(file, nest) ⇒ Object
- #get_attribute_list ⇒ Object
-
#get_celltype_plugin ⇒ Object
CompositeCelltype# generate 指定子の情報 CompositeCelltype には generate が指定できないので nil を返す Celltype::@generate を参照のこと.
- #get_global_name ⇒ Object
- #get_id_base ⇒ Object
- #get_internal_allocator_list ⇒ Object
- #get_name ⇒ Object
- #get_port_list ⇒ Object
-
#get_real_celltype(port_name) ⇒ Object
CompositeCelltype#get_real_celltype port_name に接続されている内部のセルタイプを得る.
- #get_var_list ⇒ Object
- #has_attribute?(attr) ⇒ Boolean
-
#initialize(name) ⇒ CompositeCelltype
constructor
A new instance of CompositeCelltype.
- #is_active? ⇒ Boolean
-
#is_inactive? ⇒ Boolean
CompositeCelltype# アクティブではない active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive (内部のセルが active または factory を持っている).
- #is_singleton? ⇒ Boolean
-
#new_attribute(attribute) ⇒ Object
CompositeCelltype# new_attribute for CompositeCelltype attribute:: [Decl].
-
#new_cell(cell) ⇒ Object
CompositeCelltype#new_cell.
- #new_cell_in_composite(cell) ⇒ Object
-
#new_join(export_name, internal_cell_name, internal_cell_elem_name, type) ⇒ Object
CompositeCelltype# CompositeCelltypeJoin を作成 STAGE: B export_name:: Symbol : 外部に公開する名前 internal_cell_name:: Symbol : 内部セル名 internal_cell_elem_name:: Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか) type:: :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの) RETURN:: Decl | Port : エクスポート定義 new_join は cCall => composite.cCall; (セル内) attr = composite.attr; (セル内) composite.eEnt => cell2.eEnt; (セル外) の構文要素の出現に対して呼び出される.
-
#new_port(port) ⇒ Object
CompositeCelltype# new_port.
-
#set_specifier_list(spec_list) ⇒ Object
CompositeCelltype 指定子リストの設定.
- #show_tree(indent) ⇒ Object
Methods included from PluginModule
gen_plugin_post_code, #generate_and_parse, #load_plugin
Methods included from CelltypePluginModule
#apply_plugin, #apply_plugin_cell, #celltype_plugin, #celltype_plugin_new_cell
Methods inherited from NSBDNode
#get_namespace, #get_namespace_path, #is_imported?, #set_namespace_path
Methods inherited from BDNode
Methods inherited from Node
#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str, #set_locale
Constructor Details
#initialize(name) ⇒ CompositeCelltype
Returns a new instance of CompositeCelltype.
3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 |
# File 'lib/tecsgen/core/componentobj.rb', line 3225 def initialize(name) super() @name = name @cell_list_in_composite = NamedList.new(nil, "in composite celltype #{name}") @cell_list = [] @export_name_list = NamedList.new(nil, "export in composite celltype #{name}") @name_list = NamedList.new(nil, "in composite celltype #{name}") @@current_object = self @b_singleton = false @real_singleton = nil @b_active = false @real_active = nil if Namespace.get_global_name&.empty? @global_name = @name else @global_name = :"#{Namespace.get_global_name}_#{@name}" end Namespace.new_compositecelltype(self) set_namespace_path # @NamespacePath の設定 @port_list = [] @attr_list = [] @internal_allocator_list = [] @generate_list = [] set_specifier_list(Generator.get_statement_specifier) end |
Class Method Details
.end_of_parse ⇒ Object
3254 3255 3256 3257 |
# File 'lib/tecsgen/core/componentobj.rb', line 3254 def self.end_of_parse @@current_object.end_of_parse @@current_object = nil end |
.find(name) ⇒ Object
false : if not in celltype definition, nil : if not found in celltype
3646 3647 3648 3649 3650 3651 |
# File 'lib/tecsgen/core/componentobj.rb', line 3646 def self.find(name) if @@current_object.nil? return false end @@current_object.find name end |
.has_attribute?(attr) ⇒ Boolean
3559 3560 3561 |
# File 'lib/tecsgen/core/componentobj.rb', line 3559 def self.has_attribute?(attr) @@current_object.has_attribute? attr end |
.new_attribute(attr) ⇒ Object
3616 3617 3618 |
# File 'lib/tecsgen/core/componentobj.rb', line 3616 def self.new_attribute(attr) @@current_object.new_attribute attr end |
.new_cell_in_composite(cell) ⇒ Object
CompositeCelltype#new_cell_in_composite
3360 3361 3362 |
# File 'lib/tecsgen/core/componentobj.rb', line 3360 def self.new_cell_in_composite(cell) @@current_object.new_cell_in_composite(cell) end |
.new_join(export_name, internal_cell_name, internal_cell_elem_name, type) ⇒ Object
join
3378 3379 3380 3381 3382 |
# File 'lib/tecsgen/core/componentobj.rb', line 3378 def self.new_join(export_name, internal_cell_name, internal_cell_elem_name, type) @@current_object.new_join(export_name, internal_cell_name, internal_cell_elem_name, type) end |
.new_port(port) ⇒ Object
3567 3568 3569 |
# File 'lib/tecsgen/core/componentobj.rb', line 3567 def self.new_port(port) @@current_object.new_port port end |
.pop ⇒ Object
3217 3218 3219 3220 3221 3222 3223 |
# File 'lib/tecsgen/core/componentobj.rb', line 3217 def self.pop @@current_object = @@nest_stack[@@nest_stack_index] @@nest_stack_index -= 1 if @@nest_stack_index < -1 raise "TooManyRestore" end end |
.push ⇒ Object
3211 3212 3213 3214 3215 |
# File 'lib/tecsgen/core/componentobj.rb', line 3211 def self.push @@nest_stack_index += 1 @@nest_stack[@@nest_stack_index] = @@current_object @@current_object = nil end |
Instance Method Details
#create_reverse_require_join(cell) ⇒ Object
CompositeCelltype# 逆require の結合を生成する
3637 3638 3639 3640 3641 3642 3643 |
# File 'lib/tecsgen/core/componentobj.rb', line 3637 def create_reverse_require_join(cell) @name_list.get_items.each{|n| if n.instance_of? Port n.create_reverse_require_join cell end } end |
#end_of_parse ⇒ Object
CompositeCelltype#end_of_parse
3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 |
# File 'lib/tecsgen/core/componentobj.rb', line 3260 def end_of_parse # singleton に関するチェック if @b_singleton && @real_singleton.nil? cdl_warning("W1004 $1 : specified singleton but has no singleton in this celltype", @name) elsif !@b_singleton && !@real_singleton.nil? if !@b_singleton cdl_error("S1053 $1 must be singleton. inner cell \'$2\' is singleton", @name, @real_singleton.get_name) end end # active に関するチェック if @b_active && @real_active.nil? cdl_error("S1054 $1 : specified active but has no active in this celltype", @name) elsif !@b_active && !@real_active.nil? cdl_error("S1055 $1 must be active. inner cell \'$2\' is active", @name, @real_active.get_name) end # @allocator_instance を設定する @name_list.get_items.each{|n| if n.instance_of? Port n.set_allocator_instance end } # リレーアロケータの entry 側 @port_list.each{|p| if p.get_port_type == :ENTRY if p.get_allocator_instance.nil? next end p.get_allocator_instance.each{|name, ai| if ai[0] == :RELAY_ALLOC self.new_join(:"#{p.get_name}_#{ai[4]}_#{ai[5]}", p.get_cell_name, :"#{p.get_cell_elem_name}_#{ai[4]}_#{ai[5]}", :CALL) end } end } # mikan relay が正しく抜けているかチェックされていない # callback 結合 @cell_list_in_composite.get_items.each{|c| ct = c.get_celltype if ct c.create_reverse_join end } # 意味解析 @cell_list_in_composite.get_items.each{|c| c.set_definition_join } # cell の未結合の呼び口がないかチェック @cell_list_in_composite.get_items.each{|c| c.check_join c.check_reverse_require } # 呼び口の結合について、export と内部結合の両方がないかチェック # リレーアロケータ、内部アロケータの設定 @port_list.each{|p| p.check_dup_init } # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック @name_list.get_items.each{|n| if @export_name_list.get_item(n.get_name).nil? cdl_error("S1056 $1 : cannot export, nothing designated", n.get_name) end } # 内部アロケータを設定する @internal_allocator_list.each{|cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent| res = ext_alloc_ent.get_allocator_rhs_elements(:INTERNAL_ALLOC) ep_name = res[0] cj = @export_name_list.get_item(ep_name) internal_alloc_name_from_port_def = cj.get_cell_name internal_alloc_ep_name_from_port_def = cj.get_cell_elem_name # puts "internal_allocator #{cell.get_name} #{cp_internal_name} #{port_name}.#{fd_name}.#{par_name}" cell.get_allocator_list.each{|a| # puts "allocator_list of #{cell.get_name} #{a[0]} #{a[1]}.#{a[2]}.#{a[3]}.#{a[4]} #{a[5].to_s}" if cp_internal_name == :"#{a[1]}_#{a[3]}_#{a[4]}" dbgPrint "internal_allocator {cp_internal_name} #{a[1]}_#{a[3]}_#{a[4]}\n" dbgPrint "internal_allocator: #{a[5]}, #{internal_alloc_name_from_port_def}.#{internal_alloc_ep_name_from_port_def}\n" if a[5].to_s != "#{internal_alloc_name_from_port_def}.#{internal_alloc_ep_name_from_port_def}" cdl_error("S1173 $1: allocator mismatch from $2's allocator", "#{port_name}.#{fd_name}.#{par_name}", cell.get_name) end end } } # composite プラグイン if @generate celltype_plugin end end |
#expand(name, global_name, namespacePath, join_list, region, plugin, locale) ⇒ Object
CompositeCelltype# composite celltype の cell を展開
- name
-
string: Composite cell の名前
- global_name
-
string: Composite cell の global name (C 言語名)
- join_list
-
NamedList : Composite cell に対する Join の NamedList
RETURN:
- { name => cell }, [ cell, …
-
]
戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト
3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 |
# File 'lib/tecsgen/core/componentobj.rb', line 3685 def (name, global_name, namespacePath, join_list, region, plugin, locale) # debug dbgPrint "expand composite: #{@name} name: #{name} global_name: #{global_name}\njoin_list:\n" join_list.get_items.each{|j| dbgPrint " #{j.get_name} #{j}\n" } # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone) clone_cell_list = {} clone_cell_list2 = [] clone_cell_list3 = {} # composite 内部のすべての cell について @cell_list_in_composite.get_items.each {|c| # debug dbgPrint "expand : cell #{c.get_name}\n" # Join の配列 ja = [] # CompositeCelltype が export する呼び口、受け口、属性のリストについて # @export_name_list.get_items.each{ |cj| # cj: CompositeCelltypeJoin # 新仕様では、@export_name_list に入っていない attr がありうる (@port_list + @attr_list).each{|cj| # cj: CompositeCelltypeJoin # debug dbgPrint " cj : #{cj.get_name}\n" # CompositeCelltypeJoin (export) の対象セルか? if cj.match?(c) # 対象セル内の CompositeCelltype の export する Join (attribute または call port) j = join_list.get_item(cj.get_name) # debug if j dbgPrint " REWRITE_EX parent cell: #{name} child cell: #{c.get_name}: parent's export port: #{cj.get_name} join: #{j.get_name}=>#{j.get_rhs}\n" else dbgPrint "expand : parent cell: #{name} child cell: #{c.get_name}: parent's export port: #{cj.get_name} join: nil\n" end if j # 呼び口、属性の場合 # ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる) # p "expand: cloning Join #{j.get_name} #{@name} #{name}" jc = j.clone_for_composite(@name, name, locale) # celltype_name, cell_name # debug # p "cn #{jc.get_name} #{cj.get_cell_elem_name}" # 対象セルの呼び口または属性の名前に変更 jc.change_name(cj.get_cell_elem_name) # 対象セルに対する Join の配列 ja << jc end # debug dbgPrint "\n" end } # debug dbgPrint "expand : clone #{name}_#{c.get_name}\n" # セルの clone を生成 # clone_cell_list[ "#{name}_#{c.get_name}" ] = c.clone_for_composite( name, global_name, ja ) c2 = c.clone_for_composite(name, global_name, namespacePath, ja, @name, region, plugin, locale) clone_cell_list[c.get_local_name.to_s] = c2 clone_cell_list2 << c2 clone_cell_list3[c] = c2 } clone_cell_list.each {|nm, c| dbgPrint " cloned: #{nm} = #{c.get_global_name}\n" # join の owner を clone されたセルに変更する V1.1.0.25 c.get_join_list.get_items.each{|j| j.set_cloned(clone_cell_list[c.get_local_name.to_s]) } dbgPrint "change_rhs_port: inner cell #{c.get_name}\n" c.change_rhs_port clone_cell_list3 } clone_cell_list2.each {|c| c. } return [clone_cell_list, clone_cell_list2] end |
#find(name) ⇒ Object
3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 |
# File 'lib/tecsgen/core/componentobj.rb', line 3653 def find(name) dbgPrint "CompositeCelltype: find in composite: #{name}\n" cell = @cell_list_in_composite.get_item(name) return cell if cell dbgPrint "CompositeCelltype: #{name}, #{@name_list.get_item(name)}\n" return @name_list.get_item(name) # 従来仕様 # cj = @export_name_list.get_item( name ) # p "#{name}, #{cj.get_port_decl}" # if cj then # return cj.get_port_decl # else # return nil # end end |
#find_export(name) ⇒ Object
CompositeCelltype# export する CompositeCelltypeJoin を得る
- name
-
string:
attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
3674 3675 3676 |
# File 'lib/tecsgen/core/componentobj.rb', line 3674 def find_export(name) return @export_name_list.get_item(name) end |
#gen_XML(file, nest) ⇒ Object
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 |
# File 'lib/tecsgen/core/gen_xml.rb', line 241 def gen_XML(file, nest) indent = XML_INDENT * nest if is_imported? file.print <<EOT #{indent}<import path='#{@import.get_cdl_name}'> EOT nest += 1 indent = XML_INDENT * nest end file.print <<EOT #{indent}<celltype> #{indent}#{XML_INDENT}<name> #{@name} </name> EOT file.print <<EOT #{indent}#{XML_INDENT}<composite /> EOT if @b_active file.print <<EOT #{indent}#{XML_INDENT}<active /> EOT end if @b_singleton file.print <<EOT #{indent}#{XML_INDENT}<singleton /> EOT end @name_list.get_items.each{|attr| if !attr.instance_of? Decl next end file.print <<EOT #{indent}#{XML_INDENT}<attr> #{indent}#{XML_INDENT}#{XML_INDENT}<name> #{attr.get_name} </name> #{indent}#{XML_INDENT}#{XML_INDENT}<type> #{attr.get_type.get_type_str}#{attr.get_type.get_type_str_post} </type> EOT if attr.get_initializer file.print <<EOT #{indent}#{XML_INDENT}#{XML_INDENT}<initializer> #{attr.get_initializer.to_CDL_str} </initializer> EOT end file.print <<EOT #{indent}#{XML_INDENT}</attr> EOT } @name_list.get_items.each{|port| if !port.instance_of? Port next end port_type = port.get_port_type == :CALL ? "call" : "entry" file.print <<EOT #{indent}#{XML_INDENT}<#{port_type}> #{indent}#{XML_INDENT}#{XML_INDENT}<name> #{port.get_name} </name> #{indent}#{XML_INDENT}#{XML_INDENT}<signame> #{port.get_signature.get_name} </signame> EOT if port.get_array_size file.print <<EOT #{indent}#{XML_INDENT}#{XML_INDENT}<subscript> #{port.get_array_size} </subscript> EOT end file.print <<EOT #{indent}#{XML_INDENT}</#{port_type}> EOT } file.print <<EOT #{indent}</celltype> EOT if is_imported? nest -= 1 indent = XML_INDENT * nest file.print <<EOT #{indent}</import> EOT end end |
#get_attribute_list ⇒ Object
3811 3812 3813 |
# File 'lib/tecsgen/core/componentobj.rb', line 3811 def get_attribute_list @attr_list end |
#get_celltype_plugin ⇒ Object
CompositeCelltype# generate 指定子の情報
CompositeCelltype には generate が指定できないので nil を返す Celltype::@generate を参照のこと
3838 3839 3840 |
# File 'lib/tecsgen/core/componentobj.rb', line 3838 def get_celltype_plugin nil end |
#get_global_name ⇒ Object
3803 3804 3805 |
# File 'lib/tecsgen/core/componentobj.rb', line 3803 def get_global_name @global_name end |
#get_id_base ⇒ Object
3867 3868 3869 |
# File 'lib/tecsgen/core/componentobj.rb', line 3867 def get_id_base raise "get_id_base" end |
#get_internal_allocator_list ⇒ Object
3819 3820 3821 |
# File 'lib/tecsgen/core/componentobj.rb', line 3819 def get_internal_allocator_list @internal_allocator_list end |
#get_name ⇒ Object
3799 3800 3801 |
# File 'lib/tecsgen/core/componentobj.rb', line 3799 def get_name @name end |
#get_port_list ⇒ Object
3807 3808 3809 |
# File 'lib/tecsgen/core/componentobj.rb', line 3807 def get_port_list @port_list end |
#get_real_celltype(port_name) ⇒ Object
CompositeCelltype#get_real_celltype
port_name に接続されている内部のセルタイプを得る
3825 3826 3827 3828 3829 3830 3831 3832 3833 |
# File 'lib/tecsgen/core/componentobj.rb', line 3825 def get_real_celltype(port_name) cj = find_export port_name inner_celltype = cj.get_cell.get_celltype if inner_celltype.instance_of? CompositeCelltype return inner_celltype.get_real_celltype else return inner_celltype end end |
#get_var_list ⇒ Object
3815 3816 3817 |
# File 'lib/tecsgen/core/componentobj.rb', line 3815 def get_var_list [] # 空の配列を返す end |
#has_attribute?(attr) ⇒ Boolean
3563 3564 3565 |
# File 'lib/tecsgen/core/componentobj.rb', line 3563 def has_attribute?(attr) @name_list.get_item(attr) != nil end |
#is_active? ⇒ Boolean
3846 3847 3848 |
# File 'lib/tecsgen/core/componentobj.rb', line 3846 def is_active? @b_active end |
#is_inactive? ⇒ Boolean
CompositeCelltype# アクティブではない
active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive (内部のセルが active または factory を持っている)
3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 |
# File 'lib/tecsgen/core/componentobj.rb', line 3853 def is_inactive? if @b_active == false @cell_list_in_composite.get_items.each{|c| if c.get_celltype && c.get_celltype.is_inactive? == false # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー return false end } return true else return false end end |
#is_singleton? ⇒ Boolean
3842 3843 3844 |
# File 'lib/tecsgen/core/componentobj.rb', line 3842 def is_singleton? @b_singleton end |
#new_attribute(attribute) ⇒ Object
CompositeCelltype# new_attribute for CompositeCelltype
- attribute
- Decl
3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 |
# File 'lib/tecsgen/core/componentobj.rb', line 3622 def new_attribute(attribute) attribute.each {|a| a.set_owner self # Decl (CompositeCelltype) # V1.1.0.10 composite の attr の size_is は可となった # if a.get_size_is then # cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name ) # end @name_list.add_item(a) if a.get_initializer a.get_type.check_init(@locale, a.get_identifier, a.get_initializer, :ATTRIBUTE) end } end |
#new_cell(cell) ⇒ Object
CompositeCelltype#new_cell
3385 3386 3387 3388 3389 3390 |
# File 'lib/tecsgen/core/componentobj.rb', line 3385 def new_cell(cell) @cell_list << cell # セルタイププラグインの適用 celltype_plugin_new_cell cell end |
#new_cell_in_composite(cell) ⇒ Object
3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 |
# File 'lib/tecsgen/core/componentobj.rb', line 3364 def new_cell_in_composite(cell) cell.set_owner self # Cell (in_omposite) @cell_list_in_composite.add_item(cell) if cell.get_celltype # nil ならば、すでにセルタイプなしエラー if cell.get_celltype.is_singleton? @real_singleton = cell end if cell.get_celltype.is_active? @real_active = cell end end end |
#new_join(export_name, internal_cell_name, internal_cell_elem_name, type) ⇒ Object
CompositeCelltype# CompositeCelltypeJoin を作成
STAGE: B
- export_name
-
Symbol : 外部に公開する名前
- internal_cell_name
-
Symbol : 内部セル名
- internal_cell_elem_name
-
Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか)
- type
-
:CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
- RETURN
-
Decl | Port : エクスポート定義
new_join は
cCall => composite.cCall; (セル内)
attr = composite.attr; (セル内)
composite.eEnt => cell2.eEnt; (セル外)
の構文要素の出現に対して呼び出される
3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 |
# File 'lib/tecsgen/core/componentobj.rb', line 3404 def new_join(export_name, internal_cell_name, internal_cell_elem_name, type) dbgPrint "new_join: #{export_name} #{internal_cell_name} #{internal_cell_elem_name}\n" cell = @cell_list_in_composite.get_item(internal_cell_name) if cell.nil? cdl_error("S1057 $1 not found in $2", internal_cell_name, @name) return end celltype = cell.get_celltype return if celltype.nil? # celltype == nil ならすでにエラー # 内部セルのセルタイプから対応要素を探す # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック obj = celltype.find(internal_cell_elem_name) if obj.instance_of?(Decl) if obj.get_kind == :VAR cdl_error("S1058 \'$1\' : cannot export var", internal_cell_elem_name) return elsif type != :ATTRIBUTE cdl_error("S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute", export_name) # return 次のエラーを避けるために処理続行し、付け加えてみる end elsif obj.instance_of?(Port) if obj.get_port_type != type cdl_error("S1060 \'$1\' : port type mismatch. $2 type is allowed here.", export_name, type) # return 次のエラーを避けるために処理続行し、付け加えてみる end else cdl_error("S1061 \'$1\' : not defined", internal_cell_elem_name) dbgPrint "S1061 CompositeCelltypeJoin#new_join: #{export_name} => #{internal_cell_name}.#{internal_cell_elem_name} #{type}\n" return end # エクスポート定義と一致するかどうかチェック obj2 = @name_list.get_item(export_name) if obj2.nil? cdl_error("S1062 $1 has no export definition", export_name) elsif obj2.instance_of?(Decl) if !obj.instance_of? Decl cdl_error("S1063 $1 is port but previously defined as an attribute", export_name) elsif !obj.get_type.equal? obj2.get_type cdl_error("S1064 $1 : type \'$2$3\' mismatch with pprevious definition\'$4$5\'", export_name, obj.get_type.get_type_str, obj.get_type.get_type_str_post, obj2.get_type.get_type_str, obj2.get_type.get_type_str_post) end elsif obj2.instance_of?(Port) if obj.instance_of? Port if obj.get_port_type != obj2.get_port_type cdl_error("S1065 $1 : port type $2 mismatch with previous definition $3", export_name, obj.get_port_type, obj2.get_port_type) elsif obj.get_signature != obj2.get_signature if !obj.get_signature.nil? && !obj2.get_signature.nil? # nil ならば既にエラーなので報告しない cdl_error("S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'", export_name, obj.get_signature.get_name, obj2.get_signature.get_name) end elsif obj.get_array_size != obj2.get_array_size cdl_error("S1067 $1 : array size mismatch with previous definition", export_name) elsif obj.is_optional? != obj2.is_optional? cdl_error("S1068 $1 : optional specifier mismatch with previous definition", export_name) elsif obj.is_omit? != obj2.is_omit? cdl_error("S9999 $1 : omit specifier mismatch with previous definition", export_name) elsif obj.is_dynamic? != obj2.is_dynamic? cdl_error("S9999 $1 : dynamic specifier mismatch with previous definition", export_name) elsif obj.is_ref_desc? != obj2.is_ref_desc? cdl_error("S9999 $1 : ref_desc specifier mismatch with previous definition", export_name) end else cdl_error("S1069 $1 is an attribute but previously defined as a port", export_name) end end join = CompositeCelltypeJoin.new(export_name, internal_cell_name, internal_cell_elem_name, cell, obj2) join.set_owner self # CompositeCelltypeJoin cell.add_compositecelltypejoin join # debug dbgPrint "compositecelltype join: add #{cell.get_name} #{export_name} = #{internal_cell_name}.#{internal_cell_elem_name}\n" if obj.instance_of?(Decl) # attribute # # 内部から外部へ複数の結合がないかチェック # found = false # @attr_list.each{ |a| # if a.get_name == join.get_name then # found = true # break # end # } # if found == false then @attr_list << join # end else # call/entry port # # 内部から外部へ複数の結合がないかチェック # found = false # @port_list.each{ |port| # if port.get_name == join.get_name then # found = true # break # end # } # if found == false then @port_list << join # end end # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える) if obj.instance_of?(Decl) && @export_name_list.get_item(export_name) # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。 elsif obj.instance_of?(Port) && obj.get_port_type == :CALL && @export_name_list.get_item(export_name) # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。 else @export_name_list.add_item(join) end # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合 if obj2.instance_of? Port obj2.each_param{|port, fd, par| case par.get_direction # 引数の方向指定子 (in, out, inout, send, receive ) when :SEND, :RECEIVE cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}" # アロケータ呼び口の名前 # ポート名 関数名 パラメータ名 cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}" # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない # この時点では get_allocator_instance では得られないため tmp を得る if port.get_allocator_instance_tmp found = false port.get_allocator_instance_tmp.each {|s| if s[1] == fd.get_name && s[2] == par.get_name found = true if s[0] == :INTERNAL_ALLOC # 内部アロケータの場合 # mikan これは内部のセルに直結する。外部のポートに改めるべき @internal_allocator_list << [cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3]] end end } if found == true next end end # 外部アロケータの場合 new_join(cp_name, internal_cell_name, cp_internal_name, :CALL) end } end # エクスポート定義を返す return obj2 end |
#new_port(port) ⇒ Object
CompositeCelltype# new_port
3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 |
# File 'lib/tecsgen/core/componentobj.rb', line 3572 def new_port(port) port.set_owner self # Port (CompositeCelltype) dbgPrint "new_port: #{@owner.get_name}.#{port.get_name}\n" @name_list.add_item port # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加 # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく port.each_param {|port, fd, par| case par.get_direction # 引数の方向指定子 (in, out, inout, send, receive ) when :SEND, :RECEIVE #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない # この時点では get_allocator_instance では得られないため tmp を得る if port.get_allocator_instance_tmp found = false port.get_allocator_instance_tmp.each {|s| if s[0] == :INTERNAL_ALLOC && s[1] == fd.get_name && s[2] == par.get_name found = true break end } if found == true next end end if par.get_allocator cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}" # アロケータ呼び口の名前 # ポート名 関数名 パラメータ名 alloc_sig_path = [par.get_allocator.get_name] # mikan Namespace アロケータ呼び口のシグニチャ array_size = port.get_array_size # 呼び口または受け口配列のサイズ created_port = Port.new(cp_name, alloc_sig_path, :CALL, array_size) # 呼び口を生成 created_port.set_allocator_port(port, fd, par) if port.is_omit? created_port.set_omit end new_port(created_port) # セルタイプに新しい呼び口を追加 # else # already error end end } end |
#set_specifier_list(spec_list) ⇒ Object
CompositeCelltype 指定子リストの設定
3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 |
# File 'lib/tecsgen/core/componentobj.rb', line 3777 def set_specifier_list(spec_list) return if spec_list.nil? spec_list.each {|s| case s[0] when :SINGLETON @b_singleton = true when :IDX_IS_ID cdl_warning("W1005 $1 : idx_is_id is ineffective for composite celltype", @name) when :ACTIVE @b_active = true when :GENERATE if @generate cdl_error("S9999 generate specifier duplicate") end @generate = [s[1], s[2]] # [ PluginName, "option" ] else cdl_error("S1071 $1 cannot be specified for composite", s[0]) end } end |
#show_tree(indent) ⇒ Object
3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 |
# File 'lib/tecsgen/core/componentobj.rb', line 3871 def show_tree(indent) indent.times { print " " } puts "CompositeCelltype: name: #{@name}" (indent + 1).times { print " " } puts "active: #{@b_active}, singleton: #{@b_singleton}" @cell_list_in_composite.show_tree(indent + 1) (indent + 1).times { print " " } puts "name_list" @name_list.show_tree(indent + 2) (indent + 1).times { print " " } puts "export_name_list" @export_name_list.show_tree(indent + 2) if @internal_allocator_list.length > 0 (indent + 1).times { print " " } puts "internal_allocator_list:" @internal_allocator_list.each{|a| (indent + 1).times { print " " } puts " #{a[0].get_name} #{a[1]} #{a[2]} #{a[3]} #{a[4]}" } end end |