Index: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb
===================================================================
--- asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb	(revision 352)
+++ asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb	(revision 374)
@@ -4,5 +4,5 @@
 #      Generator for TOPPERS Embedded Component System
 #  
-#   Copyright (C) 2008-2017 by TOPPERS Project
+#   Copyright (C) 2008-2019 by TOPPERS Project
 #--
 #   上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
@@ -149,5 +149,5 @@
     end
 
-    set_descriptor_list
+    # set_descriptor_list ##
 
     if @generate then
@@ -364,4 +364,14 @@
   end
 
+  @@set_descriptor_list = {}
+  def self.set_descriptor_list
+    Namespace.get_root.travers_all_signature{ |sig|
+      if @@set_descriptor_list[ sig ] == nil then
+        @@set_descriptor_list[ sig ] = true
+        sig.set_descriptor_list
+      end
+    }
+  end
+
   #== Signature# 引数で参照されている Descriptor 型のリストを作成する
   def set_descriptor_list
@@ -538,7 +548,9 @@
 # @ct_factory_list::    Factory[] :    celltype factory
 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
+# @ordered_cell_list:: Cell[] : ID 順に順序付けされたセルリスト、最適化以降有効 (リンク単位ごとに生成されなおす)
 # @singleton:: bool
 # @idx_is_id:: bool
 # @idx_is_id_act:: bool: actual value
+# @b_need_ptab:: bool: true if having cells in multi-domain
 # @active:: bool
 # @b_reuse:: bool :  reuse 指定されて import された(template 不要)
@@ -654,8 +666,11 @@
     if $idx_is_id then
       @idx_is_id = true
+      @idx_is_id_act = true
+      @b_need_ptab = true
     else
       @idx_is_id = false
-    end
-    @idx_is_id_act = @idx_is_id
+      @idx_is_id_act = false
+      @b_need_ptab = false
+    end
 
     Namespace.new_celltype( self )
@@ -700,5 +715,5 @@
     end
 
-    check_dynamic_join
+    # check_dynamic_join ##
 
     @@current_object = nil
@@ -886,4 +901,5 @@
         @idx_is_id = true
         @idx_is_id_act = true
+        @b_need_ptab = true
       when :ACTIVE
         @active = true
@@ -899,4 +915,5 @@
     if @singleton then
       @idx_is_id_act = false
+      @b_need_ptab = false
     end
   end
@@ -999,6 +1016,17 @@
   end
 
+  @@dynamic_join_checked_list = {}
+  def self.check_dynamic_join
+    Namespace.get_root.travers_all_celltype{ |ct|
+      if @@dynamic_join_checked_list[ ct ] == nil then
+        @@dynamic_join_checked_list[ ct ] = true
+        ct.check_dynamic_join
+      end
+    }
+  end
+
   #=== Celltype#dynamic の適合性チェック
   def check_dynamic_join
+    return if ! $verbose
     @port.each{ |port|
       signature = port.get_signature
@@ -1038,5 +1066,5 @@
               end
             end
-            cdl_warning( 'W9999 "$1" cannot handle Descriptor "$2" infromation for port "$3"', @name, param.get_name, port.get_name )
+            cdl_warning( 'W9999 "$1" cannot handle Descriptor "$2" information for port "$3"', @name, param.get_name, port.get_name )
           }
         end
@@ -1143,12 +1171,14 @@
   #     呼び口（ただし、最適化で不要となるものは除く）
   def has_INIB?
-#    print "name=#{@name} @n_attribute_ro=#{@n_attribute_ro}  @n_var_size_is=#{@n_var_size_is} @n_call_port=#{@n_call_port} @n_call_port_omitted_in_CB=#{@n_call_port_omitted_in_CB} @n_entry_port_array_ns=#{@n_entry_port_array_ns}\n"
-    return $rom &&
-      (@n_attribute_ro > 0 ||
-       @n_var_size_is > 0 ||
-       ( @n_call_port - @n_call_port_omitted_in_CB - (@n_call_port_dynamic-@n_call_port_array_dynamic) ) > 0 ||
-       $ram_initializer && @n_call_port_dynamic ||
-       @n_entry_port_array_ns > 0)
-#    return $rom && (@n_attribute_ro > 0 || ( @n_call_port - @n_call_port_omitted_in_CB ) > 0)
+
+    result = $rom &&
+             (@n_attribute_ro > 0 ||
+              @n_var_size_is > 0 ||
+              ( @n_call_port - @n_call_port_omitted_in_CB - (@n_call_port_dynamic-@n_call_port_array_dynamic) ) > 0 ||
+              $ram_initializer && @n_call_port_dynamic > 0 ||
+              @n_entry_port_array_ns > 0)
+    # print "name=#{@name} n_attribute_ro=#{@n_attribute_ro}  n_var_size_is=#{@n_var_size_is} n_call_port=#{@n_call_port} n_call_port_omitted_in_CB=#{@n_call_port_omitted_in_CB} n_call_port_dynamic=#{@n_call_port_dynamic} n_call_port_array_dynamic=#{@n_call_port_array_dynamic} n_entry_port_array_ns=#{@n_entry_port_array_ns} has_INIB?=#{result}\n"
+
+    return result
   end
 
@@ -1231,4 +1261,8 @@
   def idx_is_id_act?
     @idx_is_id_act
+  end
+
+  def multi_domain?
+    @b_need_ptab
   end
 
@@ -1353,4 +1387,5 @@
 #                                               逆require ポートに対して複数の結合がないかチェックする
 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
+# @b_post_code_generated:: Bool: true if generated in tmp_plugin_post_code.cdl
 #
 # composite のためインスタンス変数
@@ -1375,5 +1410,7 @@
 # @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
 # @id_specified::Integer : 指定された id
-# @restrict_list::{ entry_name => { func_name, [ region_name, ... ] } }
+# @restrict_list::{ entry_name => { func_name, [ region_path_str, ... ] } }
+# @restrict_list2::{ entry_name => { func_name, [ domain_root_region, ... ] } }
+# @b_restrict_referenced::Bool: restrict_list が参照れた
 
 =begin
@@ -1459,4 +1496,7 @@
     @referenced_port_list = {}
     @restrict_list = {}
+    @restrict_list2 = {}
+    @b_restrict_referenced = false
+    @b_post_code_generated = false
 
     @cell_list = {}
@@ -1802,4 +1842,7 @@
       # f_def == true の場合 new_def で、呼出される
       set_specifier_list( Generator.get_statement_specifier )
+    end
+    if TECSGEN.post_coded?
+      @b_post_code_generated = true
     end
     set_f_def f_def
@@ -2133,4 +2176,18 @@
   end
 
+  #=== Cell# composite のセルか？
+  def is_of_composite?
+    if @celltype.kind_of? CompositeCelltype
+      return true
+    else
+      return false
+    end
+  end
+
+  #=== Cell# tmp_plugin_post_code.cdl で生成されたセルか？
+  def post_code_generated?
+    @b_post_code_generated
+  end
+
   # composite cell の port に対応する内部の cell の port の名前（リンク時に必要な名前）
   def get_real_global_name port_name
@@ -2220,4 +2277,6 @@
 
       # セルタイプ内で port_name の CompositeCelltypeJoin を探す（コード生成段階では必ず見つかる）
+      # print "get_real_cell: cell=#{@name} port=#{port_name}\n"
+      # pp @cell_list
       cj = @celltype.find_export( port_name )
 
@@ -2231,4 +2290,13 @@
   end
 
+  #=== Cell#get_real_celltype
+  #
+  def get_real_celltype( port_name )
+    if @celltype.instance_of?( CompositeCelltype ) then
+      return @celltype.get_real_celltype port_name
+    else
+      return @celltype
+    end
+  end
 
   #=== Cell# 受け口のport の参照カウントをアップする
@@ -2271,4 +2339,16 @@
       return "#{@global_name}_#{port_name}"
     end
+  end
+
+  #Cell#属性の初期値を得る
+  #attr_name::Symbol  必ず初期化されていないと Ruby 例外となる
+  def get_attr_initializer attr_name
+    val = @join_list.get_item( attr_name )
+    if val == nil then
+      val = (@celltype.find  attr_name).get_initializer
+    else
+      val = val.get_rhs
+    end
+    return val
   end
 
@@ -2521,6 +2601,12 @@
         else
           cell = j.get_rhs_cell2
-          next if cell == nil     # 右辺が見つからなかった．既にエラー
+          next if cell == nil || cell.get_celltype == nil     # 右辺が見つからなかった．既にエラー
           port = cell.get_celltype.find( j.get_rhs_port2 )
+          if port == nil then
+            dbgPrint "set_port_ref: #{@name}.#{j.get_name} = #{cell.get_name}.#{j.get_rhs_port2}\n"
+            # through プラグインで生成されたセルの受け口が見つからないケース (のハズ)
+            cdl_error( "entry '$1' not found in '$2' refered from $3.$4", j.get_rhs_port2, cell.get_name, @name, j.get_name )
+            next
+          end
           dbgPrint( "set_port_reference_count: #{@name}.#{j.get_name} => #{cell.get_name}.#{port.get_name}\n")
           cell.port_referenced port
@@ -2967,72 +3053,111 @@
   #=== Cell#restrict を追加
   def add_restrict( entry_name, func_name, region_name_list )
-    if @restrict_list[ entry_name ] then
-      if @restrict_list[ entry_name ][ func_name ] then
-        @restrict_list[ entry_name ][ func_name ].each{ |rn|
-          if region_name_list.include? rn then
-            # p func_name
-            name = func_name ? entry_name : entry_name+"."+func_name
-            cdl_warning( "W9999 $1 restrict region duplicate $2", name, rn )
+    if @restrict_list[ entry_name ] == nil then
+      @restrict_list[ entry_name ] = {}
+      @restrict_list2[ entry_name ] = {}
+    end
+    if @restrict_list[ entry_name ][ func_name ] == nil then
+      @restrict_list[ entry_name ][ func_name ] = []
+      @restrict_list2[ entry_name ][ func_name ] = []
+    end
+    region_name_list.each { |rp|
+      @restrict_list[ entry_name ][ func_name ] << rp
+      # p "Class: " + rp.to_s
+      obj = Namespace.find rp
+      if ( obj.kind_of? Region ) then
+        @restrict_list2[ entry_name ][ func_name ] << obj.get_domain_root
+      else
+        cdl_error( "S9999 $1 not found or not region", rp.to_s )
+      end
+    }
+  end
+
+  #=== Cell#check_restrict_list
+  def check_restrict_list
+    # p "check_restrict_list"
+    @restrict_list.each{ |entry_name, func_hash|
+      func_hash.each{ |func_name, region_list|
+        region_list.each{ |rp|
+          obj = Namespace.find rp
+          if ( obj.kind_of? Region ) then
+            if obj.get_domain_root != @region.get_domain_root then
+            else
+              cdl_info( "I9999 $1: restrict calling domain to $2, which is same domain as the cell locates", @name, rp.to_s )
+              # restrict を同じドメインを指定してもよいこととする (HRP3)
+              # KernelDoamin 内のセルに対し、KernelDomain に restrict している場合、
+              # 無所属経由で結合されているが、KernelDomain から呼出すことを想定した許可
+            end
+          else
+            cdl_error( "S9999 $1 not region", rp.to_s )
+          end
+        }
+      }
+    }
+  end
+
+  #=== Cell#callable?
+  def callable?( callee_cell, entry_name, func_name )
+    # p "callable? #{@name}"
+    res = callee_cell.callable_from?( entry_name, func_name, self )
+    dbgPrint "callable? #{callee_cell.get_namespace_path}.#{entry_name}.#{func_name} from #{@NamespacePath} is #{res}\n"
+    return res
+  end
+
+  #=== Cell#callable_from? (private)
+  def callable_from?( entry_name, func_name, caller_cell )
+    @b_restrict_referenced = true
+    if @restrict_list.length == 0 then
+      return true
+    end
+
+    dr = caller_cell.get_region.get_domain_root
+    if @restrict_list[entry_name] then
+      if @restrict_list[entry_name][func_name] then
+        @restrict_list2[entry_name][func_name].each{ |region|
+          if dr == region then
+            return true
+          end
+        }
+      elsif @restrict_list[entry_name][nil] then
+        @restrict_list2[entry_name][nil].each{ |region|
+          if dr == region then
+            return true
           end
         }
       else
-        @restrict_list[ entry_name ][ func_name ] = region_name_list
-      end
-    else
-      func_list = { }
-      func_list[ func_name ] = region_name_list
-      @restrict_list[ entry_name ] = func_list
-    end
-    # pp @restrict_list
-  end
-
-  #=== Cell#check_restrict_list
-  def check_restrict_list
-    @restrict_list.each{ |entry_name, func_hash|
-      func_hash.each{ |func_name, region_list|
-        region_list.each{ |rn|
-          obj = Namespace.find [ rn ]
-          if ( obj.kind_of? Region ) then
-            if obj.get_domain_root != @region.get_domain_root then
-            else
-              cdl_warning( "W9999 $1 in same domain", rn )
-            end
-          else
-            cdl_error( "S9999 $1 not region", region )
-          end
-        }
-      }
-    }
-  end
-
-  #=== Cell#callable?
-  def callable?( callee_cell, entry_name, func_name )
-    res = callee_cell.callable_from?( entry_name, func_name, self )
-    dbgPrint "callable? #{callee_cell.get_namespace_path}.#{entry_name}.#{func_name} from #{@NamespacePath} is #{res}\n"
-    return res
-  end
-
-  #=== Cell#callable_from? (private)
-  def callable_from?( entry_name, func_name, caller_cell )
-    if @restrict_list.length == 0 then
+        return false
+      end
+    else
+      return false
+    end
+  end
+
+  #=== Cell#get_callable_regions( entry_name, func_name )
+  # func_name=nil の場合、entry_name の可否をチェック数る
+  # nil が返る場合、制限されていないことを意味する
+  def get_restricted_regions( entry_name, func_name )
+    # p "get_restricted_regions #{@name}"
+    @b_restrict_referenced = true
+    if @restrict_list[entry_name] then
+      if @restrict_list[entry_name][func_name] then
+        return @restrict_list2[entry_name][func_name]
+      else
+        return @restrict_list2[entry_name][nil]
+      end
+    end
+    return nil
+  end
+
+  #=== Cell#has_ineffective_restrict_specifier
+  # restrict 指定子が指定されていて、参照されていない場合 true
+  # 参照は、HRPSVCPlugin のみ
+  def has_ineffective_restrict_specifier
+    if @restrict_list.length != 0 && @b_restrict_referenced == false then
       return true
-    end
-
-    if @restrict_list[entry_name] then
-      if @restrict_list[entry_name][nil] &&
-         @restrict_list[entry_name][nil].include?( caller_cell.get_region.get_domain_root.get_name )then
-        return true
-      end
-      if @restrict_list[entry_name][func_name] &&
-         @restrict_list[entry_name][func_name].include?( caller_cell.get_region.get_domain_root.get_name )then
-        return true
-      else
-        return false
-      end
-    else
-      return true
-    end
-  end
-  
+    else
+      return false
+    end
+  end
+
   def show_tree( indent )
     indent.times { print "  " }
@@ -3710,4 +3835,8 @@
   end
 
+  def get_global_name
+    @global_name
+  end
+
   def get_port_list
     @port_list
@@ -3724,4 +3853,16 @@
   def get_internal_allocator_list
     @internal_allocator_list
+  end
+
+  #== CompositeCelltype#get_real_celltype
+  # port_name に接続されている内部のセルタイプを得る
+  def get_real_celltype( port_name )
+    cj = find_export port_name
+    inner_celltype = cj.get_cell.get_celltype
+    if inner_celltype.instance_of? CompositeCelltype then
+      return inner_celltype.get_real_celltype
+    else
+      return inner_celltype
+    end
   end
 
@@ -3937,5 +4078,5 @@
     else
       # entry port optimize
-      if $unopt then
+      if $unopt || $unopt_entry then
         # 最適化なし
         @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
@@ -4261,9 +4402,21 @@
 
   def is_VMT_useless?                     # VMT 関数テーブルを使用しない
-   @b_VMT_useless
+    if @port_type == :ENTRY && $unopt_entry == true then
+      # プラグインから $unopt_entry を設定するケースのため
+      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
+      return false
+    else
+      return @b_VMT_useless
+    end
   end
 
   def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
-    @b_skelton_useless
+    if @port_type == :ENTRY && $unopt_entry == true then
+      # プラグインから $unopt_entry を設定するケースのため
+      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
+      return false
+    else
+      return @b_skelton_useless
+    end
   end
 
@@ -4802,7 +4955,7 @@
       if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
         if c.get_f_ref then
-          cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
+          c.cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
         elsif $verbose then
-          cdl_warning( "W1006 $1 : only prototype, unused and undefined cell" , c.get_namespace_path.get_path_str )
+          c.cdl_warning( "W1006 $1 : only prototype, unused and undefined cell" , c.get_namespace_path.get_path_str )
         end
       else
@@ -4811,5 +4964,8 @@
         # if c.get_f_ref == false && c.is_generate? && ct && ct.is_inactive? then
         if c.get_f_ref == false && ct && ct.is_inactive? then
-          cdl_warning( "W1007 $1 : non-active cell has no entry join and no factory" , c.get_namespace_path.get_path_str )
+          c.cdl_warning( "W1007 $1 : non-active cell has no entry join and no factory" , c.get_namespace_path.get_path_str )
+        end
+        if c.has_ineffective_restrict_specifier then
+          c.cdl_warning( "W9999: $1 has ineffective restrict specifier", c.get_namespace_path.get_path_str )
         end
       end
@@ -5006,4 +5162,16 @@
   end
 
+  #== Namespace (Region) に属するセルのリスト
+  def get_cell_list
+    @cell_list
+  end
+
+  #== Namespace (Region)# 子リージョンのリスト
+  #
+  # リージョンは Namespace クラスで namespace として記憶されている
+  def get_region_list
+    @namespace_list
+  end
+  
   def show_tree( indent )
     indent.times { print "  " }
@@ -5602,4 +5770,5 @@
           next_cell_nsp       = @through_generated_list[ i + 1 ].get_cell_namespace_path
           next_port_name      = @through_generated_list[ i + 1 ].get_through_entry_port_name
+          next_port_subscript = @through_generated_list[ i + 1 ].get_through_entry_port_subscript
         rescue Exception => evar
           cdl_error( "S1124 $1: plugin function failed: \'get_through_entry_port_name\'" , plugin_name )
@@ -5620,4 +5789,5 @@
         next_cell      = @cell
         next_port_name = @port_name
+        next_port_subscript = @rhs_subscript
 
         if next_cell == nil then
@@ -5631,5 +5801,5 @@
         # region から @cell_name.@port_name への through がないか探す
         # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762
-        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name )
+        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript )
            # @through_list[i] と @region_through_list[i-cp_len] は同じ
         # 共用しないようにするには、見つからなかったことにすればよい
@@ -5644,5 +5814,5 @@
         plClass = load_plugin( plugin_name, ThroughPlugin )
         if( plClass ) then
-          gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, plClass )
+          gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, next_port_subscript, plClass )
         end
       else
@@ -5657,5 +5827,5 @@
           # 生成したものを region(@through_list[i][3]) のリストに追加
           # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762
-          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @through_generated_list[i] )
+          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript, @through_generated_list[i] )
         end
       end
@@ -5691,5 +5861,5 @@
 
   #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
-  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, plClass )
+  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, next_port_subscript, plClass )
 
     through = @through_list[ i ]
@@ -5718,5 +5888,7 @@
 
     begin
-      plugin_object = plClass.new( "#{generating_cell_name}".to_sym, plugin_arg.to_s, next_cell, "#{next_port_name}".to_sym, @definition.get_signature, @celltype, caller_cell )
+      plugin_object = plClass.new( generating_cell_name.to_sym, plugin_arg.to_s,
+                                   next_cell, next_port_name.to_sym, next_port_subscript,
+                                   @definition.get_signature, @celltype, caller_cell )
       plugin_object.set_locale @locale
     rescue Exception => evar
@@ -5913,5 +6085,12 @@
   end
 
-  def get_rhs_subscript
+  # 末尾数字1 : CDL で指定された、右辺のセルを返す
+  def get_rhs_cell1   # get_cell と同じ
+    @cell
+  end
+  def get_rhs_port1   # get_port_name 同じ
+    @port_name
+  end
+  def get_rhs_subscript1
     @rhs_subscript
   end
@@ -5923,7 +6102,5 @@
     # through 指定あり？
     if @through_list[0] then
-      # mikan through で生成したものが root namespace 限定
       # through で生成されたセルを探す
-#      cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
       cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
       # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート)
@@ -5932,4 +6109,16 @@
       # ポートを返す(composite なら内部の繋がるポートを返す)
       return @cell.get_real_port( @port_name )
+    end
+  end
+
+  #=== Join# 右辺の配列添数を得る
+  #    右辺が through の場合は挿入されたセルの添数
+  #    右辺が composite の場合は、内部の繋がるセルのポートの添数 (composite では変わらない)
+  #    このメソッドは get_rhs_cell,  と対になっている
+  def get_rhs_subscript
+    if @through_list[0] then
+      return @through_generated_list[0].get_through_entry_port_subscript
+    else
+      return @rhs_subscript
     end
   end
@@ -6569,5 +6758,5 @@
 end
 
-#== Domain
+#== DomainType
 #
 # region の domain を記憶するクラス
@@ -6608,4 +6797,5 @@
       return if pluginClass == nil
       @plugin = pluginClass.new( @region, @name, @option )
+      @plugin.set_locale @locale
     end
   end
@@ -6625,5 +6815,5 @@
   end
 
-  #== Domain リージョンの Hash を得る
+  #== DomainType リージョンの Hash を得る
   # @@domain_regions の説明参照
   def self.get_domain_regions
@@ -6637,4 +6827,10 @@
   def get_option
     @option
+  end
+
+  #== DomainType#ドメイン種別を得る
+  #return::Symbol :kernel, :user, :OutOfDomain
+  def get_kind
+    @plugin.get_kind
   end
 
@@ -6698,4 +6894,5 @@
 
     if @@domain_name then
+      dbgPrint "Region=#{name} domain_type=#{@@domain_name} option=#{@@domain_option}\n"
       domain_option = CDLString.remove_dquote @@domain_option.to_s
       @domain_type = DomainType.new( self, @@domain_name, domain_option )
@@ -6946,4 +7143,10 @@
   end
 
+  #== Region# ルートリージョン
+  # ルートリージョンは、namespace のルートと同じインスタンス
+  def selfget_root
+    Namespace.get_root
+  end
+
   def next_in_through_count
     @in_through_count += 1
@@ -6979,10 +7182,16 @@
   #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
   # mikan namesppace 対応 (cell_name)
-  def add_cell_port_through_plugin( cell_name, port_name, through_plugin_object )
-    @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}" ] = through_plugin_object
-  end
-
-  def find_cell_port_through_plugin( cell_name, port_name )
-    return @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}" ]
+  def add_cell_port_through_plugin( cell_name, port_name, subscript, through_plugin_object )
+    if subscript then
+      subscript = '[' + subscript.to_s + ']'
+    end
+    @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}#{subscript}" ] = through_plugin_object
+  end
+
+  def find_cell_port_through_plugin( cell_name, port_name, subscript )
+    if subscript then
+      subscript = '[' + subscript.to_s + ']'
+    end
+    return @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}#{subscript}" ]
   end
 
