Class: CompositeCelltype

Inherits:
NSBDNode show all
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

Instance Method Summary collapse

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

#get_owner, #set_owner

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_parseObject



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

Returns:

  • (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

.popObject



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

.pushObject



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_parseObject

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 expand(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.expand_inner
  }
  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_listObject



3811
3812
3813
# File 'lib/tecsgen/core/componentobj.rb', line 3811

def get_attribute_list
  @attr_list
end

#get_celltype_pluginObject

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_nameObject



3803
3804
3805
# File 'lib/tecsgen/core/componentobj.rb', line 3803

def get_global_name
  @global_name
end

#get_id_baseObject



3867
3868
3869
# File 'lib/tecsgen/core/componentobj.rb', line 3867

def get_id_base
  raise "get_id_base"
end

#get_internal_allocator_listObject



3819
3820
3821
# File 'lib/tecsgen/core/componentobj.rb', line 3819

def get_internal_allocator_list
  @internal_allocator_list
end

#get_nameObject



3799
3800
3801
# File 'lib/tecsgen/core/componentobj.rb', line 3799

def get_name
  @name
end

#get_port_listObject



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_listObject



3815
3816
3817
# File 'lib/tecsgen/core/componentobj.rb', line 3815

def get_var_list
  [] # 空の配列を返す
end

#has_attribute?(attr) ⇒ Boolean

Returns:

  • (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

Returns:

  • (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 を持っている)

Returns:

  • (Boolean)


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

Returns:

  • (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