Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2019 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    5237#   $Id$
     
    5439
    5540# STAGE:
    56 # このメンテナンス状況はよろしくない
    57 #  B    bnf.y.rb から呼出される
    58 #  P    parse 段階で呼出される(bnf.y.rb から直接呼出されるわけではないが、構文木生成を行う)
    59 #  S    P の中から呼出されるが、構文木生成するわけではなく意味チェックする
    60 #  G    コード生成(この段階で、構文木は完å
    61 ¨ã§ã‚る.不完å
    62 ¨ãªã‚‰ã‚¨ãƒ©ãƒ¼ã§æ‰“ちきられている)
    63 #                                                   factory の第一引数 "format" の後ろの引数
    64 
    65 # mikan 以下は ruby の mix in で実現できるかもしれない
    66 # Nestable を継承した場合、クラス変数は Nestable のものがå
    67 ±æœ‰ã•ã‚Œã‚‹ï¼ˆåˆ¥ã«ã—たかった)
     41# このメンテナンス状況はよろしくない
     42#  B    bnf.y.rb から呼出される
     43#  P    parse 段階で呼出される(bnf.y.rb から直接呼出されるわけではないが、構文木生成を行う)
     44#  S    P の中から呼出されるが、構文木生成するわけではなく意味チェックする
     45#  G    コード生成(この段階で、構文木は完全である.不完全ならエラーで打ちきられている)
     46#                                                   factory の第一引数 "format" の後ろの引数
     47
     48# mikan 以下は ruby の mix in で実現できるかもしれない
     49# Nestable を継承した場合、クラス変数は Nestable のものが共有される(別にしたかった)
    6850# class Nestable
    6951#   @@nest_stack_index = -1
     
    9072#  @name:: Symbol
    9173#  @global_name:: Symbol
    92 #  @function_head_list:: NamedList : FuncHead のインスタンスが要素
    93 #  @func_name_to_id::  {String}  :  関数名を添字とするé
    94 åˆ—で id を記憶する.id は signature の出現順番 (1から始まる)
    95 #  @context:: string : コンテキスト名
    96 #  @b_callback:: bool: callback : コールバック用のシグニチャ
    97 #  @b_deviate:: bool: deviate : 逸脱(pointer level mismatch を出さない)
    98 #  @b_checked_as_allocator_signature:: bool:  アロケータシグニチャとしてチェック済み
    99 #  @b_empty:: Bool: 空(関数が一つもない状æ
    100 ‹)
    101 #  @descriptor_list:: nil | { Signature => ParamDecl }  最後の ParamDecl しか記憶しないことに注意
    102 #  @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     74#  @function_head_list:: NamedList : FuncHead のインスタンスが要素
     75#  @func_name_to_id::  {String}  :  関数名を添字とする配列で id を記憶する.id は signature の出現順番 (1から始まる)
     76#  @context:: string : コンテキスト名
     77#  @b_callback:: bool: callback : コールバック用のシグニチャ
     78#  @b_deviate:: bool: deviate : 逸脱(pointer level mismatch を出さない)
     79#  @b_checked_as_allocator_signature:: bool:  アロケータシグニチャとしてチェック済み
     80#  @b_empty:: Bool: 空(関数が一つもない状態)
     81#  @descriptor_list:: nil | { Signature => ParamDecl }  最後の ParamDecl しか記憶しないことに注意
     82#  @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    10383
    10484  include PluginModule
     
    123103
    124104  # STAGE: P
    125   # このメソッドは parse 中のみ呼び出される
     105  # このメソッドは parse 中のみ呼び出される
    126106  def self.get_current
    127107    @@current_object
     
    134114    @name = name
    135115    Namespace.new_signature( self )
    136     set_namespace_path # @NamespacePath の設定
     116    set_namespace_path # @NamespacePath の設定
    137117    if "#{Namespace.get_global_name}" == "" then
    138118      @global_name = @name
     
    158138    @function_head_list = function_head_list
    159139
    160     # id を割付ける
     140    # id を割付ける
    161141    id = 1
    162142    function_head_list.get_items.each{ |f|
     
    180160  end
    181161
    182   #=== Signature# signature の指定子を設定
     162  #=== Signature# signature の指定子を設定
    183163  # STAGE: B
    184164  #spec_list::      [ [ :CONTEXT,  String ], ... ]
    185165  #                     s[0]        s[1]
    186166  def set_specifier_list( spec_list )
    187     return if spec_list == nil  # 空ならば何もしない
     167    return if spec_list == nil  # 空ならば何もしない
    188168
    189169    spec_list.each { |s|
     
    235215  end
    236216
    237   #=== Signature# 関数名から signature å†
    238 ã® id を得る
     217  #=== Signature# 関数名から signature 内の id を得る
    239218  def get_id_from_func_name func_name
    240219    @func_name_to_id[ func_name ]
    241220  end
    242221
    243   #=== Signature# context を得る
    244   # context 文字列を返す "task", "non-task", "any"
    245   # 未指定時のデフォルトとして task を返す
     222  #=== Signature# context を得る
     223  # context 文字列を返す "task", "non-task", "any"
     224  # 未指定時のデフォルトとして task を返す
    246225  def get_context
    247226    if @context then
     
    252231  end
    253232
    254   #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
    255   #block:: ブロックを引数に取る
    256   # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
    257   # Port クラスにも each_param がある(同じ働き)
    258   def each_param # ブロック引数 { |func_decl, param_decl| }
    259     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    260 åˆ—
    261     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    262 
    263     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    264 ¥
    265     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    266 åˆ—中の各関数頭部
    267       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    268       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    269         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     233  #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
     234  #block:: ブロックを引数に取る
     235  # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
     236  # Port クラスにも each_param がある(同じ働き)
     237  def each_param # ブロック引数 { |func_decl, param_decl| }
     238    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     239    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     240
     241    pr = Proc.new   # このメソッドのブロック引数を pr に代入
     242    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     243      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     244      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     245        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    270246          pr.call( fd, par )
    271247        }
     
    274250  end
    275251
    276   #=== Signature# 正当なアロケータ シグニチャかテストする
    277   # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
     252  #=== Signature# 正当なアロケータ シグニチャかテストする
     253  # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
    278254  def is_allocator?
    279255
    280     # 一回だけチェックする
     256    # 一回だけチェックする
    281257    if @b_checked_as_allocator_signature == true then
    282258      return true
     
    284260    @b_checked_as_allocator_signature = true
    285261
    286     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    287 åˆ—
    288     if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
     262    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     263    if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
    289264      return false
    290265    end
    291266
    292267    found_alloc = false; found_dealloc = false
    293     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    294 åˆ—中の各関数頭部
    295       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    296       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     268    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     269      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     270      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    297271        func_name = fd.get_name.to_sym
    298272        if func_name == :alloc then
     
    303277                ! params[0].get_type.get_original_type.kind_of?( IntType ) ||
    304278                params[0].get_direction != :IN then
    305               # 第一引数が int 型でない
     279              # 第一引数が int 型でない
    306280              if ! params[0].instance_of?( ParamDecl ) ||
    307281                  ! params[0].get_type.kind_of?( PtrType ) ||
     
    309283                  params[0].get_type.get_type.get_type.kind_of?( PtrType ) ||
    310284                  params[0].get_direction != :OUT then
    311                 # 第一引数がポインタ型でもない
     285                # 第一引数がポインタ型でもない
    312286                cdl_error3( @locale, "S1003 $1: \'alloc\' 1st parameter neither [in] integer type nor [out] double pointer type", @name )
    313287              end
     
    317291                params[1].get_type.get_type.get_type.kind_of?( PtrType ) ||
    318292                params[0].get_direction != :IN then
    319               # (第一引数が整数で) 第二引数がポインタでない
     293              # (第一引数が整数で) 第二引数がポインタでない
    320294              cdl_error3( @locale, "S1004 $1: \'alloc\' 2nd parameter not [in] double pointer" , @name )
    321295            end
     
    332306                params[0].get_direction != :IN then
    333307              cdl_error3( @locale, "S1006 $1: \'dealloc\' 1st parameter not [in] pointer type" , @name )
    334 #            elsif params[1] != nil then    # 第二引き数はチェックしない
     308#            elsif params[1] != nil then    # 第二引き数はチェックしない
    335309#              cdl_error3( @locale, "S1007 Error message is changed to empty" )
    336310#                 cdl_error3( @locale, "S1007 $1: \'dealloc\' cannot has 2nd parameter" , @name )
     
    354328  end
    355329
    356   #=== Signature# シグニチャプラグイン (generate 指定子)
     330  #=== Signature# シグニチャプラグイン (generate 指定子)
    357331  def signature_plugin
    358332    plugin_name = @generate[0]
     
    384358end
    385359
    386   #== Signature# 引数で参ç
    387 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを
    388   #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参ç
    389 §ã•ã‚Œã¦ã„る場合、最後のものしか返さない
     360  #== Signature# 引数で参照されている Descriptor 型のリストを
     361  #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参照されている場合、最後のものしか返さない
    390362  def get_descriptor_list
    391363    @descriptor_list
     
    402374  end
    403375
    404   #== Signature# 引数で参ç
    405 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを作成する
     376  #== Signature# 引数で参照されている Descriptor 型のリストを作成する
    406377  def set_descriptor_list
    407378    desc_list = { }
    408379    # p "has_desc #{@name}"
    409     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    410 åˆ—
    411     if fha == nil then                                  # nil の場合、自己参ç
    412 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     380    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     381    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    413382      @descriptor_list = desc_list
    414383      return desc_list
    415384    end
    416385    fha.each{ |fh|
    417       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    418       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     386      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     387      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    419388        params = fd.get_type.get_paramlist.get_items
    420389        if params then
     
    443412  end
    444413
    445   #=== Signature# 引数に Descriptor があるか?
     414  #=== Signature# 引数に Descriptor があるか?
    446415  def has_descriptor?
    447416    if get_descriptor_list == nil then
    448       # end_of_parse が呼び出される前に has_descriptor? が呼び出された
    449       # 呼び出しå
    450 ƒã¯ DescriptorType#initialize
    451       # この場合、同じシグニチャå†
    452 ã®å¼•æ•°ãŒ Descriptor 型である
     417      # end_of_parse が呼び出される前に has_descriptor? が呼び出された
     418      # 呼び出し元は DescriptorType#initialize
     419      # この場合、同じシグニチャ内の引数が Descriptor 型である
    453420      return true
    454421    elsif get_descriptor_list.length > 0 then
     
    459426  end
    460427
    461   #=== Signature# コールバックか?
    462   # 指定子 callback が指定されていれば true
     428  #=== Signature# コールバックか?
     429  # 指定子 callback が指定されていれば true
    463430  def is_callback?
    464431    @b_callback
    465432  end
    466433
    467   #=== Signature# 逸脱か?
    468   # 指定子 deviate が指定されていれば true
     434  #=== Signature# 逸脱か?
     435  # 指定子 deviate が指定されていれば true
    469436  def is_deviate?
    470437    @b_deviate
    471438  end
    472439
    473   #=== Signature# 空か?
     440  #=== Signature# 空か?
    474441  def is_empty?
    475442    @b_empty
    476443  end
    477444
    478   #=== Signature# Push Pop Allocator がå¿
    479 è¦ã‹ï¼Ÿ
    480   # Transparent RPC の場合 oneway かつ in のé
    481 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     445  #=== Signature# Push Pop Allocator が必要か?
     446  # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある
    482447  def need_PPAllocator?( b_opaque = false )
    483     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    484 åˆ—
     448    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
    485449    fha.each{ |fh|
    486450      fd = fh.get_declarator
     
    508472
    509473module CelltypePluginModule
    510   #=== Celltype# セルタイププラグイン (generate 指定子)
     474  #=== Celltype# セルタイププラグイン (generate 指定子)
    511475  def celltype_plugin
    512476    plugin_name = @generate[0]
     
    515479  end
    516480
    517   #=== Celltype# セルタイププラグインをこのセルタイプに適用
     481  #=== Celltype# セルタイププラグインをこのセルタイプに適用
    518482  def apply_plugin( plugin_name, option )
    519483
     
    543507    end
    544508
    545     # 既に存在するセルに new_cell を適用
     509    # 既に存在するセルに new_cell を適用
    546510    @cell_list.each{ |cell|
    547511      apply_plugin_cell plugin_object, cell
     
    583547# @factory_list::   Factory[]
    584548# @ct_factory_list::    Factory[] :    celltype factory
    585 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
    586 # @ordered_cell_list:: Cell[] : ID 順に順序付けされたセルリスト、最適化以降有効 (リンク単位ごとに生成されなおす)
     549# @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
     550# @ordered_cell_list:: Cell[] : ID 順に順序付けされたセルリスト、最適化以降有効 (リンク単位ごとに生成されなおす)
    587551# @singleton:: bool
    588552# @idx_is_id:: bool
     
    590554# @b_need_ptab:: bool: true if having cells in multi-domain
    591555# @active:: bool
    592 # @b_reuse:: bool :  reuse 指定されて import された(template 不要)
    593 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    594 # @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
     556# @b_reuse:: bool :  reuse 指定されて import された(template 不要)
     557# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     558# @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
    595559#
    596560# @n_attribute_ro:: int >= 0    none specified
     
    599563# @n_var:: int >= 0
    600564# @n_var_size_is:: int >= 0     # of [size_is] specified vars # mikan count_is
    601 # @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
     565# @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
    602566# @n_var_init:: int >= 0        # of vars with initializer
    603567# @n_call_port:: int >= 0       # dynamic ports are included
    604568# @n_call_port_array:: int >= 0  # dynamic ports are included
    605 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     569# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    606570# @n_call_port_dynamic:: int >= 0  #
    607571# @n_call_port_array_dynamic:: int >= 0
     
    611575# @n_entry_port_array:: int >= 0
    612576# @n_entry_port_inline:: int >= 0
    613 # @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参ç
    614 §ä¸å¯
    615 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     577# @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参照不可
     578# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    616579#
    617 # @b_cp_optimized:: bool : 呼び口最適化実施
    618 # @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
    619 #                              generate の指定は @generate にプラグインが保持される
     580# @b_cp_optimized:: bool : 呼び口最適化実施
     581# @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
     582#                              generate の指定は @generate にプラグインが保持される
    620583#
    621 # @included_header:: Hash :  include されたヘッダファイル
    622 # @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region のé
    623 åˆ— (optimize.rb で設定)
    624 #                                               ãƒ«ãƒ¼ãƒˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒã€€nil
     584# @included_header:: Hash :  include されたヘッダファイル
     585# @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region の配列 (optimize.rb で設定)
     586#                                               ルートリージョンはドメイン名が nil
    625587
    626588  include PluginModule
     
    692654
    693655    @plugin = Generator.get_plugin
    694       # plugin の場合 PluginObject が返される
    695     # å
    696 ƒã® Generator から呼出された Generator の中でパースおよび意味チェックされている
     656      # plugin の場合 PluginObject が返される
     657    # 元の Generator から呼出された Generator の中でパースおよび意味チェックされている
    697658
    698659    # if @plugin then
    699     #  # plugin 生成されるセルタイプは再利用ではない   #833 不å
    700 ·åˆä¿®æ­£
     660    #  # plugin 生成されるセルタイプは再利用ではない   #833 不具合修正
    701661    #  @b_reuse = false
    702662    # else
     
    715675
    716676    Namespace.new_celltype( self )
    717     set_namespace_path # @NamespacePath の設定
     677    set_namespace_path # @NamespacePath の設定
    718678    set_specifier_list( Generator.get_statement_specifier )
    719679
     
    727687  end
    728688
    729   #== Celltype#ドメインルートを返す
    730   # @domain_roots の説明を参ç
    731 §
     689  #== Celltype#ドメインルートを返す
     690  # @domain_roots の説明を参照
    732691  def get_domain_roots
    733692    @domain_roots
     
    736695  # Celltype# end_of_parse
    737696  def end_of_parse
    738     # 属性・変数のチェック
     697    # 属性・変数のチェック
    739698    check_attribute
    740699
    741     # アロケータ呼び口をå†
    742 éƒ¨ç”Ÿæˆ
     700    # アロケータ呼び口を内部生成
    743701    generate_allocator_port
    744702
    745     # リレーアロケータ、å†
    746 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     703    # リレーアロケータ、内部アロケータの設定
    747704    @port.each { |p|
    748705      p.set_allocator_instance
     
    814771      end
    815772      if a.get_initializer then
    816         # 登録後にチェックしても問題ない(attr を参ç
    817 §ã§ããªã„ので、自己参ç
    818 §ã—ない)
     773        # 登録後にチェックしても問題ない(attr を参照できないので、自己参照しない)
    819774        a.get_type.check_init( @locale, a.get_identifier, a.get_initializer, :ATTRIBUTE )
    820775      end
     
    822777  end
    823778
    824   #=== Celltype# celltype の attribute/var のチェック
     779  #=== Celltype# celltype の attribute/var のチェック
    825780  # STAGE:  S
    826781  #
    827   # このメソッドは celltype のパースが完了した時点で呼出される.
     782  # このメソッドは celltype のパースが完了した時点で呼出される.
    828783  def check_attribute
    829     # attribute の size_is 指定が妥当かチェック
     784    # attribute の size_is 指定が妥当かチェック
    830785    (@attribute+@var).each{ |a|
    831786      if a.get_size_is then
    832787        if ! a.get_type.kind_of?( PtrType ) then
    833           # size_is がポインタ型以外に指定された
     788          # size_is がポインタ型以外に指定された
    834789          cdl_error( "S1011 $1: size_is specified for non-pointer type" , a.get_identifier )
    835790        else
    836791
    837           # 参ç
    838 §ã™ã‚‹å¤‰æ•°ãŒå­˜åœ¨ã—、計算可能な型かチェックする
    839           size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
     792          # 参照する変数が存在し、計算可能な型かチェックする
     793          size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
    840794          init = a.get_initializer
    841795          if init then
    842796            if ! init.instance_of?( Array ) then
    843               # 初期化子がé
    844 åˆ—ではない
     797              # 初期化子が配列ではない
    845798              cdl_error( "S1012 $1: unsuitable initializer, need array initializer" , a.get_identifier )
    846799            elsif size.kind_of?( Integer ) && size < init.length then
    847               # size_is 指定された個数よりも初期化子のé
    848 åˆ—要素が多い
     800              # size_is 指定された個数よりも初期化子の配列要素が多い
    849801              cdl_error( "S1013 $1: too many initializer, $2 for $3" , a.get_identifier, init.length, size )
    850             # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
     802            # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
    851803            end
    852804
     
    858810              ( a.get_initializer.instance_of?( Expression ) &&
    859811                a.get_initializer.eval_const2(@name_list).instance_of?( Array ) ) then
    860             # size_is 指定されていないポインタが Array で初期化されていたら、エラー
     812            # size_is 指定されていないポインタが Array で初期化されていたら、エラー
    861813            cdl_error( "S1159 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    862814          end
     
    870822  end
    871823
    872   #=== Celltype# アロケータ呼び口を生成
    873   #    send, receive 引数のアロケータを呼出すための呼び口を生成
     824  #=== Celltype# アロケータ呼び口を生成
     825  #    send, receive 引数のアロケータを呼出すための呼び口を生成
    874826  def generate_allocator_port
    875827    @port.each { |port|
    876       # ポートのすべてのパラメータを辿る
     828      # ポートのすべてのパラメータを辿る
    877829      port.each_param { |port, fd, par|
    878         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     830        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    879831        when :SEND, :RECEIVE
    880832          if par.get_allocator then
    881             cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    882             #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    883             # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
     833            cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     834            #           ポート名          関数名         パラメータ名
     835            # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
    884836            alloc_sig_path = par.get_allocator.get_namespace_path
    885             array_size = port.get_array_size            # 呼び口または受け口é
    886 åˆ—のサイズ
    887             created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     837            array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     838            created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    888839            created_port.set_allocator_port( port, fd, par )
    889840            if port.is_optional? then
     
    893844              created_port.set_omit
    894845            end
    895             new_port( created_port )                    # セルタイプに新しい呼び口を追加
     846            new_port( created_port )                    # セルタイプに新しい呼び口を追加
    896847          # else
    897848          #  already error "not found or not signature" in class ParamDecl
     
    910861  end
    911862
    912   #=== Celltype# 新しいå†
    913 éƒ¨å¤‰æ•°
     863  #=== Celltype# 新しい内部変数
    914864  #var:: [Decl]
    915865  def new_var( var )
     
    924874      @name_list.add_item( i )
    925875
    926       # size_is 指定されたé
    927 åˆ—? mikan  count_is
     876      # size_is 指定された配列? mikan  count_is
    928877      if i.get_size_is then
    929878        @n_var_size_is += 1
     
    941890  end
    942891
    943   #=== Celltype# celltype の指定子を設定
     892  #=== Celltype# celltype の指定子を設定
    944893  def set_specifier_list( spec_list )
    945894    return if spec_list == nil
     
    976925
    977926  def new_require( ct_or_cell_nsp, ep_name, cp_name )
    978     # Require: set_owner するものがない
     927    # Require: set_owner するものがない
    979928    obj = Namespace.find( ct_or_cell_nsp )    #1
    980929    if obj.instance_of? Celltype then
    981       # Celltype 名で指定
     930      # Celltype 名で指定
    982931      ct = obj
    983932    elsif obj.instance_of? Cell then
    984       # Cell 名で指定
     933      # Cell 名で指定
    985934      ct = obj.get_celltype
    986935    elsif obj == nil then
     
    993942
    994943    if( ! ct.is_singleton? ) then
    995       # シングルトンではない
     944      # シングルトンではない
    996945      cdl_error( "S1018 $1 : not singleton cell" , obj.get_name )
    997946    end
    998947
    999     # 受け口を探す
     948    # 受け口を探す
    1000949    obj2 = ct.find( ep_name )
    1001950    if( ( ! obj2.instance_of? Port ) || obj2.get_port_type != :ENTRY ) then
     
    1008957
    1009958    if obj2.get_signature == nil then
    1010       # signature が未定義:既にエラー
     959      # signature が未定義:既にエラー
    1011960      return
    1012961    end
     
    1014963    require_call_port_prefix = :_require_call_port
    1015964    if cp_name == nil then
    1016       # 関数名重複チェック
     965      # 関数名重複チェック
    1017966      @require.each{ |req|
    1018967        unless req[0].to_s =~ /^#{require_call_port_prefix}/ then
    1019           next     # 名前ありの require は関数名重複チェックしない
     968          next     # 名前ありの require は関数名重複チェックしない
    1020969        end
    1021970        port = req[2]
    1022971        if port.get_signature == obj2.get_signature then
    1023           # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
     972          # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
    1024973          cdl_error( "S1021 $1 : require cannot have same signature with \'$2\'" , obj2.get_name, port.get_name )
    1025974          next
    1026975        end
    1027976        port.get_signature.get_function_head_array.each{ |f|
    1028           # mikan ここは、namedList からの検索にならないの?(効率が悪い)
     977          # mikan ここは、namedList からの検索にならないの?(効率が悪い)
    1029978          obj2.get_signature.get_function_head_array.each{ |f2|
    1030979            if( f.get_name == f2.get_name ) then
     
    1042991      b_has_name = true
    1043992    end
    1044     # require を追加
     993    # require を追加
    1045994    @require << [ cp_name, obj, obj2 ]  # [ lhs:cp_name, rhs:Celltype, rhs:Port ]
    1046995
    1047     # require port を追加 (呼び口として追加する。ただし require をセットしておく)
     996    # require port を追加 (呼び口として追加する。ただし require をセットしておく)
    1048997    port = Port.new( cp_name, obj2.get_signature.get_namespace_path, :CALL )
    1049998    port.set_require( b_has_name )
     
    10771026  end
    10781027
    1079   #=== Celltype#dynamic の適合性チェック
     1028  #=== Celltype#dynamic の適合性チェック
    10801029  def check_dynamic_join
    10811030    return if ! $verbose
    10821031    @port.each{ |port|
    10831032      signature = port.get_signature
    1084       next if signature == nil   # すでにエラー
     1033      next if signature == nil   # すでにエラー
    10851034      if port.is_dynamic? then
    10861035        dbgPrint( "[DYNAMIC] checking dynamic port: #{@global_name}.#{port.get_name}\n" )
     
    11331082  end
    11341083  def find_ref_desc_port signature
    1135     if signature == nil then  # すでにエラー
     1084    if signature == nil then  # すでにエラー
    11361085      return nil
    11371086    end
     
    11431092    return nil
    11441093  end
    1145   #=== Celltype#ディスクリプタ型でシグニチャが一致し dyn_ref に対応づく引数を探す
    1146   #dyn_ref::Symbol: :DYNAMIC=ディスクリプタを得る手段となる引数を探す.:REF_DESC=渡す手段となる引数を探す
     1094  #=== Celltype#ディスクリプタ型でシグニチャが一致し dyn_ref に対応づく引数を探す
     1095  #dyn_ref::Symbol: :DYNAMIC=ディスクリプタを得る手段となる引数を探す.:REF_DESC=渡す手段となる引数を探す
    11471096  def find_descriptor_param signature, dyn_ref
    11481097    param_list = []
     
    11861135  end
    11871136
    1188   #=== Celltype# celltype に新しい cell を追加
     1137  #=== Celltype# celltype に新しい cell を追加
    11891138  #cell:: Cell
    1190   # 新しいセルをセルタイプに追加.
    1191   # セルの構文解釈の最後でこのメソドを呼出される.
    1192   # シングルトンセルが同じ linkunit に複数ないかチェック
     1139  # 新しいセルをセルタイプに追加.
     1140  # セルの構文解釈の最後でこのメソドを呼出される.
     1141  # シングルトンセルが同じ linkunit に複数ないかチェック
    11931142  def new_cell( cell )
    11941143    dbgPrint "Celltype#new_cell( #{cell.get_name} )\n"
    1195     # Celltype では Cell の set_owner しない
    1196     # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
     1144    # Celltype では Cell の set_owner しない
     1145    # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
    11971146    if @singleton  then
    11981147      @cell_list.each{ |c|
     
    12041153    @cell_list << cell
    12051154
    1206     # プラグインにより生成されたセルタイプか ?
     1155    # プラグインにより生成されたセルタイプか ?
    12071156    if @plugin then
    12081157      @plugin.new_cell cell
    12091158    end
    12101159
    1211     # セルタイププラグインの適用
     1160    # セルタイププラグインの適用
    12121161    celltype_plugin_new_cell cell
    12131162  end
    12141163
    1215   #=== Celltype# セルタイプは INIB を持つか?
    1216   # セルタイプが INIB を持つかどうかを判定する
    1217   # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
    1218   # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
    1219   #   INIB に置かれるものは
    1220   #     attribute (omit のものは除く.現仕様では rw のものはない)
    1221   #     size_is を伴う var
    1222   #     å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     1164  #=== Celltype# セルタイプは INIB を持つか?
     1165  # セルタイプが INIB を持つかどうかを判定する
     1166  # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
     1167  # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
     1168  #   INIB に置かれるものは
     1169  #     attribute (omit のものは除く.現仕様では rw のものはない)
     1170  #     size_is を伴う var
     1171  #     呼び口(ただし、最適化で不要となるものは除く)
    12231172  def has_INIB?
    12241173
     
    12341183  end
    12351184
    1236   #=== Celltype# セルタイプは CB を持つか?
    1237   # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    1238   #   size_is が指定されていない var
    1239   #   rw 指定された attribute (現仕様では存在しない)
    1240   # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     1185  #=== Celltype# セルタイプは CB を持つか?
     1186  # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     1187  #   size_is が指定されていない var
     1188  #   rw 指定された attribute (現仕様では存在しない)
     1189  # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    12411190  #   attribute
    12421191  #   var
    1243   #   å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     1192  #   呼び口(ただし、最適化で不要となるものは除く)
    12441193  def has_CB?
    12451194    if $rom then
     
    12511200  end
    12521201
    1253   #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB がå¿
    1254 è¦ã‹
     1202  #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB が必要か
    12551203  def need_CB_initializer?
    12561204    @n_var_init > 0 || has_CB? || ( @n_call_port_dynamic && $ram_initializer )
    12571205  end
    12581206
    1259   #=== Celltype# 逆require の結合を生成する
     1207  #=== Celltype# 逆require の結合を生成する
    12601208  def create_reverse_require_join cell
    12611209    @port.each{ |p|
     
    12641212  end
    12651213
    1266   #=== Celltype# singleton セルを得る
    1267   #region:: Region   : singleton を探す Region
    1268   # 距離が最も近いものを返す
    1269   # mikan 本当は region の範囲の singleton を探すå¿
    1270 è¦ãŒã‚ã‚‹
     1214  #=== Celltype# singleton セルを得る
     1215  #region:: Region   : singleton を探す Region
     1216  # 距離が最も近いものを返す
     1217  # mikan 本当は region の範囲の singleton を探す必要がある
    12711218  def get_singleton_cell region
    12721219    cell = nil
    1273     dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
    1274     # require: celltype で指定
     1220    dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
     1221    # require: celltype で指定
    12751222    @cell_list.each{ |c|
    1276       # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
     1223      # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
    12771224      d = region.distance( c.get_region )
    12781225      #debug
     
    12931240  end
    12941241
    1295   #=== Celltype# セルタイププラグインを得る
     1242  #=== Celltype# セルタイププラグインを得る
    12961243  def get_celltype_plugin
    12971244    if @generate then
     
    13201267  end
    13211268
    1322   #=== Celltype# アクティブではないか
    1323   # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
     1269  #=== Celltype# アクティブではないか
     1270  # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
    13241271  def is_inactive?
    13251272    if @active == false && @factory_list.length == 0 &&
     
    13421289  end
    13431290
    1344   #=== Celltype# コード生成するå¿
    1345 è¦ãŒã‚るか判定
    1346   # セルの個数が 0 ならセルタイプコードは生成不要
     1291  #=== Celltype# コード生成する必要があるか判定
     1292  # セルの個数が 0 ならセルタイプコードは生成不要
    13471293  def need_generate?
    13481294    @n_cell_gen > 0
    13491295  end
    13501296
    1351   #=== Celltype# require 呼び口の結合を行う
     1297  #=== Celltype# require 呼び口の結合を行う
    13521298  # STAGE: S
    1353   # セルタイプの require 呼び口について、結合を行う
    1354   # セルが生成されないかチェックを行う
     1299  # セルタイプの require 呼び口について、結合を行う
     1300  # セルが生成されないかチェックを行う
    13551301  def set_require_join
    13561302    @require.each{ |req|
     
    13681314  end
    13691315
    1370   #=== Celltype# inline 受け口しかないか?
    1371   # 受け口が無い場合、すべての受け口が inline とはしない
     1316  #=== Celltype# inline 受け口しかないか?
     1317  # 受け口が無い場合、すべての受け口が inline とはしない
    13721318  def is_all_entry_inline?
    13731319    @n_entry_port == @n_entry_port_inline && @n_entry_port > 0
     
    14081354# @n_var:: int >= 0
    14091355# @n_var_size_is:: int >= 0     # of [size_is] specified cells # mikan count_is
    1410 # @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
     1356# @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
    14111357# @n_call_port:: int >= 0
    14121358# @n_call_port_array:: int >= 0
    1413 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     1359# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    14141360# @n_entry_port:: int >= 0
    14151361# @n_entry_port_array:: int >= 0
    14161362    (indent+1).times { print "  " }
    14171363    puts "@n_entry_port_inline #{@n_entry_port_inline}"
    1418 # @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参ç
    1419 §ä¸å¯
    1420 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     1364# @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参照不可
     1365# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    14211366
    14221367  end
     
    14241369
    14251370class Cell < NSBDNode # < Nestable
    1426 # @name:: Symbol : composite celltype のå†
    1427 å´ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã¯å¤–のセル
    1428 # @global_name:: Symbol : C で使える名前(namespace を含む)
    1429 # @local_name:: str : cell celltype name { ... } の name
     1371# @name:: Symbol : composite celltype の内側のインスタンスでは外のセル
     1372# @global_name:: Symbol : C で使える名前(namespace を含む)
     1373# @local_name:: str : cell celltype name { ... } の name
    14301374# @celltype:: Celltype | CompositeCelltype
    14311375# @join_list:: NamedList
     
    14341378# @b_prototype:: bool:  prototype specified in current parsing cell. (@b_defined is used to determine whether definition done)
    14351379# @b_duplicate:: bool:  definition duplicate
    1436 # @b_checked::   bool:  set_definition_join が済んでいる場合 true
    1437 # @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
     1380# @b_checked::   bool:  set_definition_join が済んでいる場合 true
     1381# @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
    14381382# @f_ref:: refercenced from others
    1439 # @entry_array_max_subscript:: { @port=>Integer } : 受け口é
    1440 åˆ—のé
    1441 åˆ—添数の最大値(添数無し受け口é
    1442 åˆ—対応)
     1383# @entry_array_max_subscript:: { @port=>Integer } : 受け口配列の配列添数の最大値(添数無し受け口配列対応)
    14431384# @plugin::     Plugin: avialble if cell is generated by plugin generated cdl code.
    1444 # @referenced_port_list:: { Port => Integer } : 受け口の参ç
    1445 §æ•°
    1446 #                                               ã™ã¹ã¦ã®æ„å‘³è§£æž(through, composite展開)が終わった後に設定する
    1447 #                                               é€†require ポートに対して複数の結合がないかチェックする
    1448 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     1385# @referenced_port_list:: { Port => Integer } : 受け口の参照数
     1386#                                               すべての意味解析(through, composite展開)が終わった後に設定する
     1387#                                               逆require ポートに対して複数の結合がないかチェックする
     1388# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    14491389# @b_post_code_generated:: Bool: true if generated in tmp_plugin_post_code.cdl
    14501390#
    1451 # composite のためインスタンス変数
     1391# composite のためインスタンス変数
    14521392# @in_composite:: bool : true if in composite celltype
    14531393# @compositecelltypejoin_list:: NamedList : item= CompositeCelltypeJoin ( if @in_composite )
    14541394# @f_cloned:: bool : true if cloned (instantiate of composite consist cell)
    1455 # @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
    1456 # @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
    1457 # @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
    1458 #                          @cell_list2 は composite å†
    1459 ã§ã®å‡ºç¾é † 
     1395# @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
     1396# @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
     1397# @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
     1398#                          @cell_list2 は composite 内での出現順 
    14601399#
    1461 # region のためのインスタンス変数
    1462 # @region:: Region (属するregion)
     1400# region のためのインスタンス変数
     1401# @region:: Region (属するregion)
    14631402#
    1464 # allocator のためのインスタンス変数
     1403# allocator のためのインスタンス変数
    14651404# @alloc_list::  [ [ NORMAL_ALLOC, ep_name, func_name, param_name, expr ], ... ]
    1466 #   å—け口側のアロケータへの結合を記憶。以下のメソッドで追加される
    1467 #      set_specifier … cell 定義時にアロケータ指定されている場合
    1468 #      create_relay_allocator_join … リレーアロケータの場合
     1405#   受け口側のアロケータへの結合を記憶。以下のメソッドで追加される
     1406#      set_specifier … cell 定義時にアロケータ指定されている場合
     1407#      create_relay_allocator_join … リレーアロケータの場合
    14691408#
    1470 # ID のためのインスタンス変数(optimize.rb にて設定)
    1471 # @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
    1472 # @id_specified::Integer : 指定された id
     1409# ID のためのインスタンス変数(optimize.rb にて設定)
     1410# @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
     1411# @id_specified::Integer : 指定された id
    14731412# @restrict_list::{ entry_name => { func_name, [ region_path_str, ... ] } }
    14741413# @restrict_list2::{ entry_name => { func_name, [ domain_root_region, ... ] } }
    1475 # @b_restrict_referenced::Bool: restrict_list が参ç
    1476 §ã‚ŒãŸ
     1414# @b_restrict_referenced::Bool: restrict_list が参照れた
    14771415
    14781416=begin
    1479 # Cell クラスは、以下のものを扱う
    1480 # 1)普通のセル
    1481 # 2)composite セルタイプのセル
    1482 # 3)composite セルタイプのå†
    1483 å´ã®ã‚»ãƒ« (@in_composite)   # composite のå†
    1484 å´ã® composite セルタイプのセルもある
     1417# Cell クラスは、以下のものを扱う
     1418# 1)普通のセル
     1419# 2)composite セルタイプのセル
     1420# 3)composite セルタイプの内側のセル (@in_composite)   # composite の内側の composite セルタイプのセルもある
    14851421#
    1486 # 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
    1487 #    expand (composite セルの展開) は CellOfComposite にのみå¿
    1488 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1489 #    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
    1490 #    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
     1422# 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
     1423#    expand (composite セルの展開) は CellOfComposite にのみ必要なメソッドである
     1424#    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
     1425#    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
    14911426#
    1492 # 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
    1493 #    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
    1494 #    clone_for_composite は CellInCompoiste にのみå¿
    1495 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1496 #    ただし、clone 後に Cell, CellOfComposite に変化するå¿
    1497 è¦ãŒã‚るので、clone ではなく new する実è£
    1498 ã«å¤‰æ›´ã™ã‚‹å¿
    1499 è¦ãŒã‚ã‚‹
     1427# 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
     1428#    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
     1429#    clone_for_composite は CellInCompoiste にのみ必要なメソッドである
     1430#    ただし、clone 後に Cell, CellOfComposite に変化する必要があるので、clone ではなく new する実装に変更する必要がある
    15001431#
    15011432=end
     
    15071438  @@current_object = nil
    15081439
    1509   # 定義されたすべてのセル(出現順. namespace に影響されない)
    1510   @@cell_list = []     # composite のå†
    1511 éƒ¨ã®ã‚»ãƒ«ã‚’含まない
    1512   @@cell_list2 = []    # composite のå†
    1513 éƒ¨ã®ã‚»ãƒ«ã‚’含む (å
    1514 ƒã®ã‚»ãƒ«ã‚’含む)
    1515                        # 意味解析後 make_cell_list2 にて設定される
     1440  # 定義されたすべてのセル(出現順. namespace に影響されない)
     1441  @@cell_list = []     # composite の内部のセルを含まない
     1442  @@cell_list2 = []    # composite の内部のセルを含む (元のセルを含む)
     1443                       # 意味解析後 make_cell_list2 にて設定される
    15161444
    15171445  def self.push
     
    15331461    @region = Region.get_current
    15341462
    1535     # celltype のplugin/存在をチェック
     1463    # celltype のplugin/存在をチェック
    15361464    object = Namespace.find( ct_path )    #1
    15371465    if object == nil then
    1538       # mikan celltype の名前が不完å
    1539 ¨ "::ct1ct2" になる
     1466      # mikan celltype の名前が不完全 "::ct1ct2" になる
    15401467      cdl_error( "S1027 \'$1\' celltype not found" , ct_path.get_path_str )
    15411468    elsif ! object.instance_of?( Celltype ) && ! object.instance_of?( CompositeCelltype ) then
    1542       # mikan celltype の名前が不完å
    1543 ¨
     1469      # mikan celltype の名前が不完全
    15441470      cdl_error( "S1028 \'$1\' not celltype" , ct_path.get_path_str )
    15451471    else
     
    15921518    end
    15931519
    1594     # この時点ではプロトタイプか、定義か分らないが、自己参ç
    1595 §ã®ãŸã‚ã«ç™»éŒ²
    1596     # set_f_def で再度登録しなおす
    1597     # Celltype への登録は、end_of_parse で行う
     1520    # この時点ではプロトタイプか、定義か分らないが、自己参照のために登録
     1521    # set_f_def で再度登録しなおす
     1522    # Celltype への登録は、end_of_parse で行う
    15981523    if @in_composite then
    15991524      cell_prev = CompositeCelltype.find( name )
     
    16021527      end
    16031528    else
    1604       # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
     1529      # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
    16051530      cell_prev = Namespace.get_current.find( name )
    16061531      if cell_prev == nil then
    16071532        Namespace.new_cell( self )
    1608         set_namespace_path # @NamespacePath の設定
     1533        set_namespace_path # @NamespacePath の設定
    16091534      end
    16101535    end
     
    16131538      if ! cell_prev.instance_of?( Cell ) then
    16141539        cdl_error( "S1029 $1 mismatch with previous one" , name )
    1615         # celltype が一致しているか ?
     1540        # celltype が一致しているか ?
    16161541      elsif get_celltype != cell_prev.get_celltype then
    16171542        cdl_error( "S1030 $1: celltype mismatch with previous one" , name )
    16181543      else
    1619         # region が一致しているか?
     1544        # region が一致しているか?
    16201545        if ! cell_prev.get_region.equal? get_region then
    16211546          cdl_error( "S1031 $1 region \'$2\' mismatch  with previous one \'$3\'" , name, @region.get_name, cell_prev.get_region.get_name )
     
    16231548
    16241549        @@current_object = cell_prev
    1625         # この時点では、まだプロトタイプ宣言か定義か分らない
    1626         # 以前が定義であって、今回も定義の場合、重複エラーである
     1550        # この時点では、まだプロトタイプ宣言か定義か分らない
     1551        # 以前が定義であって、今回も定義の場合、重複エラーである
    16271552      end
    16281553    end
     
    16341559    dbgPrint "Cell new_cell: #{@global_name} #{@in_composite} #{self}\n"
    16351560
    1636     # å†
    1637 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’ @alloc_list に追加
     1561    # 内部アロケータを @alloc_list に追加
    16381562    if @celltype.instance_of? CompositeCelltype then
    16391563      @celltype.get_internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    16401564        nsp = NamespacePath.new( @name, false )
    1641         rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
     1565        rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
    16421566
    16431567        @alloc_list << [:NORMAL_ALLOC,port_name,nil,fd_name,par_name,rhs]
     
    16471571  end
    16481572
    1649   #=== Cell# cell の定義
    1650   # 本体(join)の定義の直前に呼び出される
     1573  #=== Cell# cell の定義
     1574  # 本体(join)の定義の直前に呼び出される
    16511575  def self.new_def
    16521576    @@current_object.new_def
    16531577  end
    16541578
    1655   #=== Cell# cell の定義
    1656   # 本体(join)の定義の直前に呼び出される
    1657   # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
     1579  #=== Cell# cell の定義
     1580  # 本体(join)の定義の直前に呼び出される
     1581  # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
    16581582  def new_def
    16591583    set_specifier_list( Generator.get_statement_specifier )
    16601584
    1661     # prototype 指定子ないか
     1585    # prototype 指定子ないか
    16621586    if ! @b_prototype then
    1663       # 二重定義のチェック
     1587      # 二重定義のチェック
    16641588      if @b_defined == true then
    16651589        cdl_error( "S1032 $1: duplicate cell" , @name )
    16661590        dbgPrint "previous: #{@prev_locale[0]}: line #{@prev_locale[1]} '#{@name}' defined here\n"
    16671591
    1668         # セルの重複定義エラーの処置
    1669         # 前の定義は捨てる
     1592        # セルの重複定義エラーの処置
     1593        # 前の定義は捨てる
    16701594        @join_list = NamedList.new( nil, "in cell '#{@name}'" )
    16711595      end
     
    16801604  end
    16811605
    1682   #===  Cell# 新しい結合をチェック
     1606  #===  Cell# 新しい結合をチェック
    16831607  # STAGE:   P
    16841608  #
    1685   #join::  Join : 新しい結合
    1686   #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
     1609  #join::  Join : 新しい結合
     1610  #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
    16871611  def new_join( join, b_regular = false )
    16881612    join.set_owner self
    16891613
    1690     # composite の新文法対応.
    1691     # composite の中のセルで、attribute の定義である場合
    1692     # cell å†
    1693 ã® attr_ext = composite.attr; 構文を処理
     1614    # composite の新文法対応.
     1615    # composite の中のセルで、attribute の定義である場合
     1616    # cell 内の attr_ext = composite.attr; 構文を処理
    16941617    if @in_composite then
    16951618      if @celltype then
    1696         if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
     1619        if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
    16971620          rhs = join.get_rhs
    16981621          if rhs.instance_of? Expression then
    16991622            ele = rhs.get_elements
    1700             if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単é 
    1701 ï¼‰ã‹ï¼Ÿ #1
    1702               if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
    1703                 ident = ele[1].get_name   # 右辺は attribute.
     1623            if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単項)か? #1
     1624              if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
     1625                ident = ele[1].get_name   # 右辺は attribute.
    17041626              else
    1705                 # 右辺は attribute にないのであれば、定数のはず
    1706                 # 定数は下へ渡す (cell の join にする)
     1627                # 右辺は attribute にないのであれば、定数のはず
     1628                # 定数は下へ渡す (cell の join にする)
    17071629                ident = nil
    17081630              end
    17091631            else
    1710               if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
    1711                 # 右辺が、単一のシンボルでない場合、現状は扱えない
     1632              if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
     1633                # 右辺が、単一のシンボルでない場合、現状は扱えない
    17121634                cdl_error( "S1033 rhs expression is not supported. Only attribute is permitted on current version."  )
    17131635                return
    17141636              else
    1715                 # 定数は下へ渡す (cell の join にする)
     1637                # 定数は下へ渡す (cell の join にする)
    17161638                ident = nil
    17171639              end
     
    17191641
    17201642            if ident then
    1721               # attr = attr; のような参ç
    1722 §ã¯ã‚¨ãƒ©ãƒ¼ (a = composite.a とするå¿
    1723 è¦ãŒã‚ã‚‹)
     1643              # attr = attr; のような参照はエラー (a = composite.a とする必要がある)
    17241644              if @celltype.find( ident ) then
    17251645                cdl_error( "S1034 $1 : cannot refer to $2\'s attribute here. Use \'composite.$3\' to refer to composite celltype\'s" , ident, @celltype.get_name, ident )
     
    17271647            end
    17281648          elsif rhs.instance_of? Array then
    1729             if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
     1649            if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
    17301650              ident = rhs[1].to_sym
    17311651            else
    1732               ident = nil    # 右辺は { 10, -10 } の形式
     1652              ident = nil    # 右辺は { 10, -10 } の形式
    17331653            end
    17341654          else
    1735             ident = nil      # 右辺は C_EXP の形式
     1655            ident = nil      # 右辺は C_EXP の形式
    17361656          end
    17371657
    1738           # ident が見つかった(右辺は単一の ident)
     1658          # ident が見つかった(右辺は単一の ident)
    17391659          if ident then
    1740             # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
     1660            # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
    17411661            #                        export_name, internal_cell_name, internal_cell_elem_name
    1742             decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
     1662            decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
    17431663            if ! decl.instance_of? Decl then
    17441664              return
     
    17481668              return
    17491669            end
    1750             # 以下の旧文法実è£
    1751 ã«æ¸¡ã™ï¼Ž
    1752             # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
    1753             # attribute で指定された初期値を cell の属性として処理させる
     1670            # 以下の旧文法実装に渡す.
     1671            # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
     1672            # attribute で指定された初期値を cell の属性として処理させる
    17541673            join.change_rhs( ini )
    17551674          else
    1756             # ident がない.定数式
     1675            # ident がない.定数式
    17571676          end
    17581677        else
    1759           # celltype の属性として、この join の名前がない
    1760           # 以下の join.set_definition の中でエラーとなる
     1678          # celltype の属性として、この join の名前がない
     1679          # 以下の join.set_definition の中でエラーとなる
    17611680        end
    17621681      else
    1763         return    # celltype がない.すでにエラー
     1682        return    # celltype がない.すでにエラー
    17641683      end
    17651684    elsif join.get_rhs.instance_of? Array then
    17661685      rhs = join.get_rhs
    17671686      if rhs[0] == :COMPOSITE then
    1768         # composite の中でないのに attr = composite.attr が使われた
     1687        # composite の中でないのに attr = composite.attr が使われた
    17691688        cdl_error( "S1035 composite : cannot specify out of composite celltype definition"  )
    17701689        return
     
    17721691    end
    17731692
    1774     # 以下 composite 文法変更前からある処理
    1775 
    1776     # 既に左辺が同じ名前の初期化が存在するか?
    1777     j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
    1778     if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
     1693    # 以下 composite 文法変更前からある処理
     1694
     1695    # 既に左辺が同じ名前の初期化が存在するか?
     1696    j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
     1697    if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
    17791698
    17801699      # debug
    17811700      dbgPrint "add_array_member: #{@name} port: #{j.get_port_name} rhs: #{j.get_rhs}, #{join.get_port_name} #{join.get_rhs}\n"
    1782       # 呼び口é
    1783 åˆ—(であると仮定して)要素を追加
     1701      # 呼び口配列(であると仮定して)要素を追加
    17841702      j.add_array_member join
    17851703
     
    17901708    end
    17911709
    1792     # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
     1710    # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
    17931711    #   dbgPrint "Cell#new_join: #{get_owner.get_name}.#{@name}\n"
    17941712    # else
     
    18041722  end
    18051723
    1806   #=== Cell.新しい逆結合
     1724  #=== Cell.新しい逆結合
    18071725  def self.new_reverse_join( reverse_join )
    18081726    @@current_object.new_reverse_join( reverse_join )
    18091727  end
    18101728
    1811   #=== Cell#新しい逆結合
     1729  #=== Cell#新しい逆結合
    18121730  def new_reverse_join( reverse_join )
    18131731    dbgPrint( "new_reverse_join name=#{reverse_join.get_name}\n")
     
    18341752  end
    18351753
    1836   #=== Cell#逆結合から結合を生成
     1754  #=== Cell#逆結合から結合を生成
    18371755  # STAGE: S
    18381756  def create_reverse_join
     
    18441762#      @reverse_join_list.get_items.each{ |rj|
    18451763      @reverse_join_list.each{ |rj|
    1846         # 逆結合のæƒ
    1847 å ±ã‚’å¾—ã‚‹
     1764        # 逆結合の情報を得る
    18481765        ep_name = rj.get_name
    18491766        ep_subscript, cp_cell_nsp, cp_name, cp_subscript = rj.get_rhs_cell_and_port
    18501767
    1851         # 呼び口側のセルと、そのセルタイプ
     1768        # 呼び口側のセルと、そのセルタイプ
    18521769        if ! @in_composite then
    18531770          cell = Namespace.find cp_cell_nsp
     
    18911808  end
    18921809
    1893   #=== Cell# cell å†
    1894 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
    1895   # internal_cell_elem_name:: string : 呼び口名
    1896   # export_name:: string: composite の外部にå
    1897 ¬é–‹ã™ã‚‹å‘¼ã³å£å
    1898   #  呼び口を外部結合する.
    1899   #  このメソッドは、composite の中の cell でしか呼ばれない.
     1810  #=== Cell# cell 内に記述する呼び口の外部結合
     1811  # internal_cell_elem_name:: string : 呼び口名
     1812  # export_name:: string: composite の外部に公開する呼び口名
     1813  #  呼び口を外部結合する.
     1814  #  このメソッドは、composite の中の cell でしか呼ばれない.
    19001815  def external_join( internal_cell_elem_name, export_name, b_composite )
    19011816
    1902     # cCall => composite.cCall; ではないか?
     1817    # cCall => composite.cCall; ではないか?
    19031818    if( b_composite == false )then
    1904       # cCall => cCall; のような場合
     1819      # cCall => cCall; のような場合
    19051820      if @celltype.find( export_name ) then
    19061821        cdl_error( "S1036 $1 : cannot refer to $2\'s here. Use \'composite.$3\' to refer to composite celltype\'s" , export_name, @celltype.get_name, export_name )
    19071822      end
    19081823    end
    1909     # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
     1824    # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
    19101825    CompositeCelltype.new_join( export_name, @name,  internal_cell_elem_name, :CALL )
    19111826  end
     
    19191834
    19201835  def end_of_parse f_def
    1921     if @b_prototype then  # prototype 指定子あったか?
    1922       f_def = false       # プロトタイプ宣言とする
     1836    if @b_prototype then  # prototype 指定子あったか?
     1837      f_def = false       # プロトタイプ宣言とする
    19231838      @b_prototype = false
    19241839    end
    19251840    if f_def == false then
    1926       # cell tCelltype Cell; の形式の場合
    1927       # f_def == true の場合 new_def で、呼出される
     1841      # cell tCelltype Cell; の形式の場合
     1842      # f_def == true の場合 new_def で、呼出される
    19281843      set_specifier_list( Generator.get_statement_specifier )
    19291844    end
     
    19381853  end
    19391854
    1940   #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
    1941   #    このメソッドは構文解釈の最後に呼出される
     1855  #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
     1856  #    このメソッドは構文解釈の最後に呼出される
    19421857  #f_def::     bool     false if prototype, true if definition
    19431858  def set_f_def f_def
     
    19481863    if ! @in_composite then
    19491864      # if @celltype.instance_of? Celltype then
    1950       if @celltype then  # composite でも呼びだす, エラー時 nil
     1865      if @celltype then  # composite でも呼びだす, エラー時 nil
    19511866        @celltype.new_cell self
    19521867      end
     
    19591874    @f_ref = true
    19601875
    1961     # composite のå†
    1962 éƒ¨ã‚»ãƒ«ã‚’参ç
    1963 §ã•ã‚ŒãŸã“とにする
    1964     # 今のところ問題ないが、未参ç
    1965 §ã§ã‚るべきものまで参ç
    1966 §ã•ã‚ŒãŸã“とになる
     1876    # composite の内部セルを参照されたことにする
     1877    # 今のところ問題ないが、未参照であるべきものまで参照されたことになる
    19671878    if @cell_list then
    19681879      @cell_list.each{ |cn,cell|
     
    19721883  end
    19731884
    1974   #=== Cell# cell の指定子を設定
     1885  #=== Cell# cell の指定子を設定
    19751886  # STAGE:  B
    19761887  #
    1977   #    bnf.y.rb の statement_specifiler_list
     1888  #    bnf.y.rb statement_specifiler_list
    19781889  #spec_list::      [ :ALLOCATOR, [ [ :NORMAL_ALLOC, ep_name, subscript, func_name, param_name, expr ], ... ] ]
    19791890  #                     s[0]      s[1]   a[0]        a[1]       a[2]        a[3]     a[4]       a[5]
    1980   #    セルに指定されたアロケータ指定子
    1981   #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
    1982   #    受け口側に生成されるアロケータ呼び口の結合をå†
    1983 éƒ¨ç”Ÿæˆã™ã‚‹
    1984   #    呼び口側は Port の create_allocator_join にて生成
    1985   #    リレーアロケータの場合 create_relay_allocator_join にて生成す
     1891  #    セルに指定されたアロケータ指定子
     1892  #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
     1893  #    受け口側に生成されるアロケータ呼び口の結合を内部生成する
     1894  #    呼び口側は Port の create_allocator_join にて生成
     1895  #    リレーアロケータの場合 create_relay_allocator_join にて生成す
    19861896  def set_specifier_list( spec_list )
    1987     return if spec_list == nil  # 空ならば何もしない
     1897    return if spec_list == nil  # 空ならば何もしない
    19881898
    19891899    dbgPrint( "set_spec_list: #{@name}\n" )
    1990     b_generate = false   # generate が指定された
     1900    b_generate = false   # generate が指定された
    19911901
    19921902    spec_list.each{ |s|
    19931903      case s[0]             # statement_specifier
    19941904      when :ALLOCATOR       # [allocator(ePort.func.param=allocCell.eA,ePort.func2.param=allocCell.eA)]
    1995         s[1].each { |a|     # alloc_list : allocator のå†
    1996 éƒ¨ã® ',' で区切られた部分のé
    1997 åˆ—
    1998           cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
     1905        s[1].each { |a|     # alloc_list : allocator の内部の ',' で区切られた部分の配列
     1906          cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
    19991907          # p "#{a[0]} #{a[0+1]} #{a[2+1]} #{a[3+1]} #{cp_name}"
    20001908          if a[1+1] then
     
    20041912            subscript = nil
    20051913          end
    2006           # アロケータ呼び口の結合を生成
    2007           join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
     1914          # アロケータ呼び口の結合を生成
     1915          join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
    20081916          dbgPrint( "new allocator join #{cp_name} #{subscript} #{a[4+1]}\n" )
    20091917          Cell.new_join( join )
     
    20511959  def get_allocator_list
    20521960
    2053     # 意味チェック(set_definition)されていない?
    2054     # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
     1961    # 意味チェック(set_definition)されていない?
     1962    # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
    20551963    if @b_checked == false then
    20561964      set_definition_join
     
    20631971  end
    20641972
    2065   #=== id 指定子の値を設定
    2066   # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
    2067   # 通常の id 指定子では使っていない
     1973  #=== id 指定子の値を設定
     1974  # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
     1975  # 通常の id 指定子では使っていない
    20681976  def set_specified_id id
    20691977    if Integer( id ) != id || id <= 0 then
     
    20761984  end
    20771985
    2078   #=== Cell# セルプラグイン (generate 指定子)
     1986  #=== Cell# セルプラグイン (generate 指定子)
    20791987  def cell_plugin
    20801988    plugin_name = @generate[0]
     
    20891997
    20901998    plClass = load_plugin( plugin_name, CellPlugin )
    2091     # return if plClass == nil # 従来と仕様が変わるので、継続する
     1999    # return if plClass == nil # 従来と仕様が変わるので、継続する
    20922000    if $verbose then
    20932001      print "new cell plugin: plugin_object = #{plClass.class.name}.new( #{@name}, #{option} )\n"
     
    21092017  end
    21102018
    2111   #=== Cell# cell を composite セルタイプのセル用に clone する
    2112   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    2113   #global_name:: string : 親 cell の global_name
    2114   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    2115   #ct_name::     string : 親セルのセルタイプ名
    2116   #region::      Region : å
    2117 ƒã®ã‚»ãƒ«ãŒå±žã™ã‚‹ region
    2118   #このメソッドは CompositeCelltype の expand から呼出される
     2019  #=== Cell# cell を composite セルタイプのセル用に clone する
     2020  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     2021  #global_name:: string : 親 cell の global_name
     2022  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     2023  #ct_name::     string : 親セルのセルタイプ名
     2024  #region::      Region : 元のセルが属する region
     2025  #このメソッドは CompositeCelltype の expand から呼出される
    21192026  def clone_for_composite( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    21202027
     
    21252032    @my_clone = self.clone
    21262033
    2127     # clone したセルのå†
    2128 éƒ¨ã«æŒã¤åå‰æƒ
    2129 å ±ã‚’調整する
     2034    # clone したセルの内部に持つ名前情報を調整する
    21302035    @my_clone.set_cloned( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    21312036
    2132     # @celltype == nil は以前にセルタイプ未定義エラー
     2037    # @celltype == nil は以前にセルタイプ未定義エラー
    21332038    if @b_defined == true && @celltype != nil then
    21342039      if @celltype.instance_of?( Celltype ) then
    2135         # celltype に登録(コード生成の対象となる)
     2040        # celltype に登録(コード生成の対象となる)
    21362041        @celltype.new_cell( @my_clone )
    21372042      end
     
    21412046  end
    21422047
    2143   #=== Cell# clone されたセルのå†
    2144 éƒ¨ã«æŒã¤åå‰æƒ
    2145 å ±ã‚’調整する
    2146   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    2147   #global_name:: string : 親 cell の global_name
    2148   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    2149   #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
    2150   #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
     2048  #=== Cell# clone されたセルの内部に持つ名前情報を調整する
     2049  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     2050  #global_name:: string : 親 cell の global_name
     2051  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     2052  #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
     2053  #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
    21512054  def set_cloned( name, global_name, namespacePath, join_array, parent_ct_name, region, plugin, locale )
    21522055
     
    21652068    @f_cloned = true
    21662069
    2167     # Namespace.new_cell( self )  # mikan namespace 対応
    2168     region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
    2169 
    2170     # join_list : NamedList の clone を作る
     2070    # Namespace.new_cell( self )  # mikan namespace 対応
     2071    region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
     2072
     2073    # join_list : NamedList の clone を作る
    21712074    if @celltype then
    21722075      dbgPrint "set_cloned: #{@celltype.get_name} #{@name} #{region.get_name}\n"
     
    21812084    @cell_list2 = []
    21822085
    2183     # このセルのグローバル名を与える
    2184     # C_EXP の$id$ 置換はこのセルの名前になる
     2086    # このセルのグローバル名を与える
     2087    # C_EXP の$id$ 置換はこのセルの名前になる
    21852088    join_array.each { |j|
    21862089      @join_list.change_item j
     
    21882091  end
    21892092
    2190   #=== clone されたセルが composite の場合、å†
    2191 éƒ¨ã‚»ãƒ«ã‚’展開する
    2192   #self:: clone されたセルでなければならない
     2093  #=== clone されたセルが composite の場合、内部セルを展開する
     2094  #self:: clone されたセルでなければならない
    21932095  def expand_inner
    21942096    if ! @f_cloned then
     
    21962098    end
    21972099
    2198     # clone しようとするセルが composit セルタイプ?
     2100    # clone しようとするセルが composit セルタイプ?
    21992101    if @celltype.instance_of?( CompositeCelltype ) then
    2200       # composite cell を再帰的に展開
     2102      # composite cell を再帰的に展開
    22012103      @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    22022104    end
    22032105  end
    22042106
    2205   #=== Cell# clone された cell の join_list の右辺の変更
    2206   #  呼び口の右辺の cell を他の clone された cell に置換え
     2107  #=== Cell# clone された cell の join_list の右辺の変更
     2108  #  呼び口の右辺の cell を他の clone された cell に置換え
    22072109  def change_rhs_port cloned_cell_list
    22082110
     
    22472149  end
    22482150
    2249   #=== Cell# 生成されるセルか?
    2250   # 最適化、コード生成中に、対象となる region に属する場合 true を返す
     2151  #=== Cell# 生成されるセルか?
     2152  # 最適化、コード生成中に、対象となる region に属する場合 true を返す
    22512153  def is_generate?
    22522154    if $generating_region == nil then
    2253       # 構文解釈、意味解析段階で呼ばれると例外発生
     2155      # 構文解釈、意味解析段階で呼ばれると例外発生
    22542156      raise "is_generate? called before optimizing"
    22552157    end
     
    22632165  end
    22642166
    2265   #=== Cell# composite å†
    2266 éƒ¨ã®è¤‡è£½ã•ã‚ŒãŸã‚»ãƒ«ã‹ï¼Ÿ
    2267   # composite 定義のå†
    2268 éƒ¨ã®ã‚»ãƒ« (@in_composite = true) ではない
     2167  #=== Cell# composite 内部の複製されたセルか?
     2168  # composite 定義の内部のセル (@in_composite = true) ではない
    22692169  def is_cloned?
    22702170    @f_cloned
    22712171  end
    22722172
    2273   #=== Cell# composite å†
    2274 éƒ¨ã®ã‚»ãƒ«ã‹ï¼Ÿ
     2173  #=== Cell# composite 内部のセルか?
    22752174  def is_in_composite?
    22762175    @in_composite
    22772176  end
    22782177
    2279   #=== Cell# composite のセルか?
     2178  #=== Cell# composite のセルか?
    22802179  def is_of_composite?
    22812180    if @celltype.kind_of? CompositeCelltype
     
    22862185  end
    22872186
    2288   #=== Cell# tmp_plugin_post_code.cdl で生成されたセルか?
     2187  #=== Cell# tmp_plugin_post_code.cdl で生成されたセルか?
    22892188  def post_code_generated?
    22902189    @b_post_code_generated
    22912190  end
    22922191
    2293   # composite cell の port に対応するå†
    2294 éƒ¨ã® cell の port の名前(リンク時にå¿
    2295 è¦ãªåå‰ï¼‰
     2192  # composite cell の port に対応する内部の cell の port の名前(リンク時に必要な名前)
    22962193  def get_real_global_name port_name
    22972194    if @celltype.instance_of?( CompositeCelltype ) then
     
    23212218  end
    23222219
    2323   #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
    2324   #    namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
     2220  #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
     2221  #    namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
    23252222  def get_real_global_port_name port_name
    23262223
    2327     # composite か?
     2224    # composite か?
    23282225    if @celltype.instance_of?( CompositeCelltype ) then
    23292226
     
    23362233      }
    23372234
    2338       # セルタイプå†
    2339 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2340 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2235      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23412236      cj = @celltype.find_export( port_name )
    23422237
     
    23442239      dbgPrint "   composite join name: #{cj.get_name}  cell: #{cj.get_cell_name}  cell elem: #{cj.get_cell_elem_name}\n"
    23452240
    2346       # composite のå†
    2347 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_global_port_name を適用
     2241      # composite の内部のセルに対し再帰的に get_real_global_port_name を適用
    23482242      name = @cell_list[ "#{cj.get_cell_name}" ].get_real_global_port_name( cj.get_cell_elem_name )
    23492243      return name
     
    23572251  end
    23582252
    2359   #=== Cell# PORT (celltype の定義) を得る
     2253  #=== Cell# PORT (celltype の定義) を得る
    23602254  def get_real_port( port_name )
    23612255
    2362     # composite か?
     2256    # composite か?
    23632257    if @celltype.instance_of?( CompositeCelltype ) then
    23642258
    2365       # セルタイプå†
    2366 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2367 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2259      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23682260      cj = @celltype.find_export( port_name )
    23692261
    2370       # composite のå†
    2371 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2262      # composite の内部のセルに対し再帰的に get_real_port を適用
    23722263      port = @cell_list[ "#{cj.get_cell_name}" ].get_real_port( cj.get_cell_elem_name )
    23732264      return port
     
    23782269  end
    23792270
    2380   #=== Cell# cell を得る
    2381   #    composite でなければ自分自身を返す
     2271  #=== Cell# cell を得る
     2272  #    composite でなければ自分自身を返す
    23822273  def get_real_cell( port_name )
    23832274
    2384     # composite か?
     2275    # composite か?
    23852276    if @celltype.instance_of?( CompositeCelltype ) then
    23862277
    2387       # セルタイプå†
    2388 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2389 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2278      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23902279      # print "get_real_cell: cell=#{@name} port=#{port_name}\n"
    23912280      # pp @cell_list
    23922281      cj = @celltype.find_export( port_name )
    23932282
    2394       # composite のå†
    2395 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2283      # composite の内部のセルに対し再帰的に get_real_port を適用
    23962284      cell = @cell_list[ "#{cj.get_cell_name}" ].get_real_cell( cj.get_cell_elem_name )
    23972285      return cell
     
    24122300  end
    24132301
    2414   #=== Cell# 受け口のport の参ç
    2415 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
    2416   #port_name:: Symbol  : ポート名
     2302  #=== Cell# 受け口のport の参照カウントをアップする
     2303  #port_name:: Symbol  : ポート名
    24172304  def port_referenced port
    24182305    if @referenced_port_list[ port ] then
     
    24222309    end
    24232310
    2424     # composite か?
     2311    # composite か?
    24252312    if @celltype.instance_of?( CompositeCelltype ) then
    24262313
    2427       # セルタイプå†
    2428 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2429 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2314      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    24302315      cj = @celltype.find_export( port.get_name )
    24312316
    24322317      dbgPrint " port_referenced: #{@celltype.get_name} #{@name} cj=#{cj&&(cj.get_name)||"nil"}\n"
    24332318
    2434       if cj then  # 既にエラー
    2435         # composite のå†
    2436 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2319      if cj then  # 既にエラー
     2320        # composite の内部のセルに対し再帰的に get_real_port を適用
    24372321        cell = @cell_list[ "#{cj.get_cell_name}" ]
    24382322        if cell && cell.get_celltype then
     
    24572341  end
    24582342
    2459   #Cell#属性の初期値を得る
    2460   #attr_name::Symbol  å¿
    2461 ãšåˆæœŸåŒ–されていないと Ruby 例外となる
     2343  #Cell#属性の初期値を得る
     2344  #attr_name::Symbol  必ず初期化されていないと Ruby 例外となる
    24622345  def get_attr_initializer attr_name
    24632346    val = @join_list.get_item( attr_name )
     
    24992382  end
    25002383
    2501   #=== Cell# 受け口é
    2502 åˆ—の添数の最大値を設定
     2384  #=== Cell# 受け口配列の添数の最大値を設定
    25032385  def set_entry_port_max_subscript( port, num )
    25042386    dbgPrint( "set_entry_port_max_subscript: #{@name}.#{port.get_name}: #{num}\n" )
     
    25112393  end
    25122394
    2513   #=== Cell# composite のå†
    2514 å´ã‚»ãƒ«ã®å—け口é
    2515 åˆ—の添数の最大値を設定
     2395  #=== Cell# composite の内側セルの受け口配列の添数の最大値を設定
    25162396  def set_entry_inner_port_max_subscript( port, num )
    25172397    if @cell_list == nil then
    2518       return    # プロトタイプ宣言しかされていなくて、å†
    2519 å´ã‚»ãƒ«ãŒå±•é–‹ã•ã‚Œã¦ã„ない or composite 展開前
    2520     end
    2521 
    2522     # composite のå†
    2523 å´ã®ã‚»ãƒ«ã«ä¼æ’­
     2398      return    # プロトタイプ宣言しかされていなくて、内側セルが展開されていない or composite 展開前
     2399    end
     2400
     2401    # composite の内側のセルに伝播
    25242402    if @celltype.instance_of? CompositeCelltype then
    25252403      dbgPrint "set_entry_inner_port_max_subscript #{@name} #{@port} #{num} cell_list.len=#{@cell_list.length}\n"
     
    25382416  end
    25392417
    2540   #=== Cell# 受け口é
    2541 åˆ—の添数の最大値を返す
    2542   # 長さは +1 する
    2543   # 1つもない場合は -1 を返す
     2418  #=== Cell# 受け口配列の添数の最大値を返す
     2419  # 長さは +1 する
     2420  # 1つもない場合は -1 を返す
    25442421  def get_entry_port_max_subscript( port )
    25452422    subscript = @entry_array_max_subscript[port]
     
    25502427  end
    25512428
    2552   #=== Cell# リレーアロケータの結合を生成
     2429  #=== Cell# リレーアロケータの結合を生成
    25532430  # STAGE: S
    2554   # 呼び口側の結合をå
    2555 ƒã«å—け口側の結合を生成
     2431  # 呼び口側の結合を元に受け口側の結合を生成
    25562432  def create_relay_allocator_join
    25572433
    2558     # celltype がなければチェックしない(既にエラー)
     2434    # celltype がなければチェックしない(既にエラー)
    25592435    return if @celltype == nil
    25602436
    2561     # relay allocator を生成
     2437    # relay allocator を生成
    25622438    @celltype.get_port_list.each { |p|
    25632439      ail = p.get_allocator_instance
     
    25652441        dbgPrint "create_relay_allocator_join: #{@name}, #{p.get_name}\n"
    25662442        if p.get_array_size then
    2567           # mikan relay allocator が array に対応できてもよいのでは?
     2443          # mikan relay allocator が array に対応できてもよいのでは?
    25682444          cdl_error( "S1040 array not supported for relay allocator"  )
    25692445          next
     
    25732449          if ai2[0] == :RELAY_ALLOC then
    25742450            dbgPrint "create_relay_allocator_join: #{@name}, #{name}\n"
    2575             # 呼び口側の結合を取り出す
     2451            # 呼び口側の結合を取り出す
    25762452            ja = @join_list.get_item( :"#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    25772453            if ja == nil then
    2578               # 見つからない場合
     2454              # 見つからない場合
    25792455              found = false
    25802456             
    2581               # composite å†
    2582 ã§å¤–部に結合されているか
     2457              # composite 内で外部に結合されているか
    25832458              if @in_composite then
    25842459                @compositecelltypejoin_list.get_items.each { |cj|
     
    25972472                cdl_error( "S1041 \'$1_$2_$3\': not joined. cannot create internal join for relay allocator" , ai2[3], ai2[4], ai2[5] )
    25982473                print( "      In cell #{get_name}\n" )
    2599                 # join が未結合であることのエラーは二度でる (S1043)
     2474                # join が未結合であることのエラーは二度でる (S1043)
    26002475              end
    2601               next    # 打ち切る
     2476              next    # 打ち切る
    26022477            end
    26032478
    26042479            b_export = false
    2605             # composite å†
    2606 ã®ã‚»ãƒ«ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るかチェック
    2607             #  mikan エクスポート側と、こちら側で、リレーå
    2608 ˆãŒä¸€è‡´ã™ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ãŒå¿
    2609 è¦
     2480            # composite 内のセルでエクスポートされているかチェック
     2481            #  mikan エクスポート側と、こちら側で、リレー先が一致するかチェックが必要
    26102482            if @compositecelltypejoin_list then
    2611               # export されているか調べる
     2483              # export されているか調べる
    26122484              @compositecelltypejoin_list.get_items.each{ |cj|
    2613                 # 属性名と composite の export する名前は一致するか
     2485                # 属性名と composite の export する名前は一致するか
    26142486                if p.get_name == cj.get_cell_elem_name then
    26152487                  print "export : #{p.get_name}\n"
    2616                   b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
     2488                  b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
    26172489                  break
    26182490                end
     
    26212493            end
    26222494
    2623             # mikan é
    2624 åˆ—
     2495            # mikan 配列
    26252496            am = nil
    26262497            if am then
     
    26292500                subscript = ja2.get_subscript
    26302501                if b_export == false then
    2631                   # CompositeCelltype の場合、å†
    2632 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2502                  # CompositeCelltype の場合、内側のセルで生成させる
    26332503                  join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs, @loacle )
    26342504                  # p ( "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs )
    26352505                  new_join( join )
    26362506                  join.set_definition( @celltype.find(join.get_name) )
    2637                   # mikan relay mismatch チェックができていない(下方を参ç
    2638 §ï¼‰
     2507                  # mikan relay mismatch チェックができていない(下方を参照)
    26392508                end
    26402509                @alloc_list << [ :NORMAL_ALLOC, p.get_name, subscript, ai2[1], ai2[2], rhs ]
     
    26422511            else
    26432512              if b_export == false then
    2644                 # CompositeCelltype の場合、å†
    2645 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2513                # CompositeCelltype の場合、内側のセルで生成させる
    26462514                join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", nil, ja.get_rhs, @locale )
    26472515                new_join( join )
     
    26532521                                      "#{p.get_name}_#{ai2[1]}_#{ai2[2]}",
    26542522                                      "#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    2655                     # 本当は composite の呼び口と受け口の間で行うべきだが、å†
    2656 éƒ¨ã§å¤šæ®µæŽ¥ç¶šã•ã‚Œã¦ã„る場合
     2523                    # 本当は composite の呼び口と受け口の間で行うべきだが、内部で多段接続されている場合
    26572524                  else
    26582525                    dbgPrint "relay success:  #{p.get_name}_#{ai2[1]}_#{ai2[2]}=>#{ai2[3]}_#{ai2[4]}_#{ai2[5]} #{jr.get_rhs_cell2.get_name}.#{jr.get_rhs_port2} \n"
     
    26692536  end
    26702537
    2671   #=== Cell# @@cell_list2 を作る
    2672   # @@cell_list2 は、出現順に composite å†
    2673 ã‚’含むセルのリスト
     2538  #=== Cell# @@cell_list2 を作る
     2539  # @@cell_list2 は、出現順に composite 内を含むセルのリスト
    26742540  def self.make_cell_list2
    26752541    @@cell_list.each{ |c|
     
    26792545  end
    26802546
    2681   #=== Cell# @@cell_list2 を得る
    2682   # composite å†
    2683 ã‚’含む (compositeも含む)
    2684   # 意味解析後に作成される
     2547  #=== Cell# @@cell_list2 を得る
     2548  # composite 内を含む (compositeも含む)
     2549  # 意味解析後に作成される
    26852550  def self.get_cell_list2
    26862551    @@cell_list2
    26872552  end
    26882553
    2689   #=== Cell# @@cell_list を得る
    2690   #composite の中を含まない
     2554  #=== Cell# @@cell_list を得る
     2555  #composite の中を含まない
    26912556  def self.get_cell_list
    26922557    @@cell_list
    26932558  end
    26942559
    2695   #=== Cell# reverse_join を生成する
     2560  #=== Cell# reverse_join を生成する
    26962561  def self.create_reverse_join
    26972562    @@cell_list.each{ |c|
     
    27052570  end
    27062571
    2707   #=== Cell# reverse_require_join を生成する
     2572  #=== Cell# reverse_require_join を生成する
    27082573  def self.create_reverse_require_join
    27092574    @@cell_list2.each{ |c|
     
    27112576      # if c.is_generate? then
    27122577        if ct then
    2713           # self への呼び口側の結合を生成
     2578          # self への呼び口側の結合を生成
    27142579          ct.create_reverse_require_join c
    27152580        end
     
    27182583  end
    27192584
    2720   #=== Cell# 受け口のport の参ç
    2721 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
    2722   # self は呼びå
    2723 ƒã®ã‚»ãƒ«
    2724   # 呼びå
    2725 ˆã‚»ãƒ«ã®å—け口の参ç
    2726 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
     2585  #=== Cell# 受け口のport の参照カウントを設定する
     2586  # self は呼び元のセル
     2587  # 呼び先セルの受け口の参照カウントをアップする
    27272588  def set_port_reference_count
    27282589    @join_list.get_items.each { |j|
    27292590      if j.get_definition.instance_of? Port then
    27302591        am = j.get_array_member2
    2731         if am then             # 呼び口é
    2732 åˆ—
     2592        if am then             # 呼び口配列
    27332593          am.each { |j2|
    2734             next if j2 == nil    # optional で一部が欠落しているケース
     2594            next if j2 == nil    # optional で一部が欠落しているケース
    27352595            cell = j2.get_rhs_cell2
    2736             next if cell == nil     # 右辺が見つからなかった.既にエラー
     2596            next if cell == nil     # 右辺が見つからなかった.既にエラー
    27372597            port = cell.get_celltype.find( j2.get_rhs_port2 )
    27382598            dbgPrint( "set_port_reference_count: #{@name}.#{j2.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    27412601        else
    27422602          cell = j.get_rhs_cell2
    2743           next if cell == nil || cell.get_celltype == nil     # 右辺が見つからなかった.既にエラー
     2603          next if cell == nil || cell.get_celltype == nil     # 右辺が見つからなかった.既にエラー
    27442604          port = cell.get_celltype.find( j.get_rhs_port2 )
    27452605          if port == nil then
    27462606            dbgPrint "set_port_ref: #{@name}.#{j.get_name} = #{cell.get_name}.#{j.get_rhs_port2}\n"
    2747             # through プラグインで生成されたセルの受け口が見つからないケース (のハズ)
     2607            # through プラグインで生成されたセルの受け口が見つからないケース (のハズ)
    27482608            cdl_error( "entry '$1' not found in '$2' refered from $3.$4", j.get_rhs_port2, cell.get_name, @name, j.get_name )
    27492609            next
     
    27562616  end
    27572617
    2758   #=== Cell# 結合(Join)のチェック
    2759   #     Join は呼び口の結合または attribute の初期化
     2618  #=== Cell# 結合(Join)のチェック
     2619  #     Join は呼び口の結合または attribute の初期化
    27602620  #
    2761   #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
    2762   #  ・リレーアロケータの生成 => create_relay_allocator_join
    2763   #  ・未結合の呼び口のチェック
    2764   #  ・ポインタ型がé
    2765 åˆ—で初期化される場合のチェック
    2766   #  ・未初期化の属性のチェック
     2621  #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
     2622  #  ・リレーアロケータの生成 => create_relay_allocator_join
     2623  #  ・未結合の呼び口のチェック
     2624  #  ・ポインタ型が配列で初期化される場合のチェック
     2625  #  ・未初期化の属性のチェック
    27672626  def check_join
    27682627
    2769     # celltype がなければチェックしない(既にエラー)
     2628    # celltype がなければチェックしない(既にエラー)
    27702629    return if @celltype == nil
    27712630    return if @b_defined == false
    2772     return if @f_cloned == true    # å†
    2773 éƒ¨ã‚»ãƒ«ã«ã¤ã„ては、composite の定義時にチェックされている
     2631    return if @f_cloned == true    # 内部セルについては、composite の定義時にチェックされている
    27742632
    27752633    # debug
     
    27792637    # end
    27802638
    2781     # 未結合の呼び口のチェック
     2639    # 未結合の呼び口のチェック
    27822640    @celltype.get_port_list.each { |p|
    27832641
    2784       # 呼び口でなければ、チェックしない
     2642      # 呼び口でなければ、チェックしない
    27852643      next if p.get_port_type != :CALL
    27862644
     
    27882646      dbgPrint "check_join: #{@name} #{get_celltype.get_name} #{p.get_name}\n"
    27892647
    2790       # 結合リストの中から呼び口名に一致するものを取りだす
     2648      # 結合リストの中から呼び口名に一致するものを取りだす
    27912649      j = @join_list.get_item( p.get_name )
    27922650
    27932651      if j == nil then
    2794         # 未結合の呼び口
    2795 
    2796         # composite celltype のå†
    2797 éƒ¨ã®å ´åˆã€composite celltype が export する呼び口に結合されているか探す
     2652        # 未結合の呼び口
     2653
     2654        # composite celltype の内部の場合、composite celltype が export する呼び口に結合されているか探す
    27982655        found = false
    27992656        if @in_composite then
    2800           # composite celltype の export するものすべてから探す
    2801           # (export するものの右辺値から探すために get_item ではダメ)
     2657          # composite celltype の export するものすべてから探す
     2658          # (export するものの右辺値から探すために get_item ではダメ)
    28022659          @compositecelltypejoin_list.get_items.each{ |cj|
    2803             # 呼び口名と composite の export する名前は一致するか
     2660            # 呼び口名と composite の export する名前は一致するか
    28042661            if p.get_name == cj.get_cell_elem_name then
    28052662              found = true
     
    28082665        end
    28092666
    2810         # 呼び口é
    2811 åˆ—の場合 optional でå
    2812 ¨ã¦ã®è¦ç´ ãŒåˆæœŸåŒ–されない場合に、ここへ来る
     2667        # 呼び口配列の場合 optional で全ての要素が初期化されない場合に、ここへ来る
    28132668        if ! found && ! p.is_require? && ! p.is_optional? then
    28142669          if ! p.is_allocator_port? then
     
    28192674        end
    28202675      elsif p.get_array_size.kind_of? Integer then
    2821         # 添数あり呼び口é
    2822 åˆ—の場合、すべての添数要素が初期化されているかチェックする
     2676        # 添数あり呼び口配列の場合、すべての添数要素が初期化されているかチェックする
    28232677
    28242678        am = j.get_array_member2
    28252679        if( am )then
    2826           # join はé
    2827 åˆ—
    2828 
    2829           # 呼び口é
    2830 åˆ—定義でのé
    2831 åˆ—の大きさ
     2680          # join は配列
     2681
     2682          # 呼び口配列定義での配列の大きさ
    28322683          length = p.get_array_size
    28332684
    2834           # é
    2835 åˆ—の大きさが呼び口é
    2836 åˆ—定義と結合定義で一致するか?
     2685          # 配列の大きさが呼び口配列定義と結合定義で一致するか?
    28372686          if am.length != length then
    28382687            if ! p.is_optional? || am.length >= length then
    2839               # optional の場合、要素数が少なすぎるのは OK
     2688              # optional の場合、要素数が少なすぎるのは OK
    28402689              cdl_error( "S1044 $1: array initializer too many or few, $2 for $3" , p.get_name, am.length, length )
    28412690            end
    28422691
    2843             # am の要素に nil を追加しておく (#_CPA_# のコード生成時、このé
    2844 åˆ—要素数分生成)
     2692            # am の要素に nil を追加しておく (#_CPA_# のコード生成時、この配列要素数分生成)
    28452693            i = am.length
    28462694            while i < length
     
    28502698          end
    28512699
    2852 #          # é
    2853 åˆ—要素の抜けがないかチェック
    2854 #          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
     2700#          # 配列要素の抜けがないかチェック
     2701#          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
    28552702#            length = am.length
    28562703#          end
     
    28622709              end
    28632710            else
    2864               # 生成されないリージョンへの結合かチェック
     2711              # 生成されないリージョンへの結合かチェック
    28652712              if ! @in_composite then
    28662713                am[i].check_region2
     
    28712718
    28722719        # else
    2873         # join が非é
    2874 åˆ—であれば、既にエラー
     2720        # join が非配列であれば、既にエラー
    28752721        end
    28762722      elsif j.get_array_member then
    2877         # 添数なし呼び口é
    2878 åˆ—の場合
     2723        # 添数なし呼び口配列の場合
    28792724        am = j.get_array_member2
    28802725        length = am.length
     
    28892734        end
    28902735
    2891         # 生成されないリージョンへの結合かチェック
     2736        # 生成されないリージョンへの結合かチェック
    28922737        if ! @in_composite then
    28932738          am.each { |join|
     
    28982743        end
    28992744      else
    2900         # 呼び口[é
    2901 åˆ—」でない場合
    2902 
    2903         # 生成されないリージョンへの結合かチェック
     2745        # 呼び口[配列」でない場合
     2746
     2747        # 生成されないリージョンへの結合かチェック
    29042748        if ! @in_composite then
    29052749          j.check_region2
     
    29092753    }
    29102754
    2911     # ポインタ型がé
    2912 åˆ—で初期化される場合のチェック
     2755    # ポインタ型が配列で初期化される場合のチェック
    29132756    (@celltype.get_attribute_list+@celltype.get_var_list).each { |a|
    29142757      if a.get_size_is then
    29152758
    29162759        if a.instance_of? CompositeCelltypeJoin then
    2917           # 既にエラーになっている
     2760          # 既にエラーになっている
    29182761          # cdl_error( "S1047 size_is pointer cannot be exposed for composite attribute"  )
    29192762          next
     
    29252768          size = a.get_size_is.eval_const( @join_list, @celltype.get_name_list )
    29262769          a.get_type.set_scs( a.get_size_is, nil, nil, nil, false )
    2927           if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
    2928             # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
     2770          if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
     2771            # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
    29292772            cdl_error( "S1049 $1: size_is arg not constant" , a.get_name )
    29302773          else
     
    29422785              end
    29432786            else
    2944               # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
     2787              # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
    29452788              ini = a.get_initializer
    29462789              if ini.instance_of? Expression
     
    29572800      else
    29582801        if ! a.instance_of? CompositeCelltypeJoin then
    2959           # composite は size_is 指定できない
     2802          # composite は size_is 指定できない
    29602803          if a.get_type.kind_of?( PtrType ) then
    29612804            j = @join_list.get_item( a.get_identifier )
    29622805            if j && j.get_rhs.instance_of?( Array ) then
    2963               ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
     2806              ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
    29642807              cdl_error( "S1169 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    29652808            end
     
    29692812    }
    29702813
    2971     # 未初期化の属性をチェック
     2814    # 未初期化の属性をチェック
    29722815    @celltype.get_attribute_list.each { |a|
    29732816      b_init = false
    29742817      # self.show_tree 1
    2975       if a.get_initializer then                               # セルタイプで初期化されている
     2818      if a.get_initializer then                               # セルタイプで初期化されている
    29762819        b_init = true
    2977         # @in_composite で export されている場合には、この初期値は使われない
    2978         # export されている、いないに関わらず、初期化されていることが保証される
    2979       elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
     2820        # @in_composite で export されている場合には、この初期値は使われない
     2821        # export されている、いないに関わらず、初期化されていることが保証される
     2822      elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
    29802823        b_init = true
    29812824      elsif @in_composite && @compositecelltypejoin_list then
    2982         # 属性が export されているか調べる。export されていれば未初期化とはしない
    2983         # mikan リニアサーチ
     2825        # 属性が export されているか調べる。export されていれば未初期化とはしない
     2826        # mikan リニアサーチ
    29842827        @compositecelltypejoin_list.get_items.each{ |cj|
    2985           # 属性名と composite の export する名前は一致するか
     2828          # 属性名と composite の export する名前は一致するか
    29862829          if a.get_name.to_sym == cj.get_cell_elem_name.to_sym then
    2987             b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
     2830            b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
    29882831          end
    29892832        }
    29902833        if b_init then
    2991           # size_is の引数がマッチするかチェックする
    2992           # å†
    2993 éƒ¨ã‚»ãƒ«ã® size_is をエクスポートする size_is とマッチするかチェックする
    2994           # å†
    2995 éƒ¨ã‚»ãƒ«ã¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§åå‰ã‚’変えている可能性があるので、å†
    2996 éƒ¨ã‚»ãƒ«ã® size_is の名前を変換した上でチェックする
     2834          # size_is の引数がマッチするかチェックする
     2835          # 内部セルの size_is をエクスポートする size_is とマッチするかチェックする
     2836          # 内部セルとエクスポートで名前を変えている可能性があるので、内部セルの size_is の名前を変換した上でチェックする
    29972837          if a.get_size_is then
    29982838            ### p "attr: get_size_is"
     
    30002840            if cj.get_port_decl.instance_of? Decl then
    30012841              ### p "attr: get_size_is 2"
    3002               # cj_size_is は、外部å
    3003 ¬é–‹ã•ã‚Œã‚‹ attr の size_is
     2842              # cj_size_is は、外部公開される attr の size_is
    30042843              cj_size_is = cj.get_port_decl.get_size_is
    30052844              if cj_size_is == nil then
     
    30102849              remain = exprs
    30112850              inner_to_export = {}
    3012                           ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
     2851                          ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
    30132852              while remain != "" && remain != nil
    30142853                ### p "remain ", remain
    3015                 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
     2854                remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
    30162855                                if $2 == nil then
    30172856                                                break
     
    30202859                remain = $'
    30212860                ### p exprs, $1, $2, $'
    3022                 # size_is に含まれる変数は、composite で export されているか
     2861                # size_is に含まれる変数は、composite で export されているか
    30232862                cj2 = nil
    30242863                @compositecelltypejoin_list.get_items.each{ |cj2t|
     
    30332872                if cj2.get_port_decl.instance_of? Decl then
    30342873                   decl2 = cj2.get_port_decl
    3035                    # å†
    3036 éƒ¨ã®åå‰ã¨å¤–部の名前の対応関係を記憶
     2874                   # 内部の名前と外部の名前の対応関係を記憶
    30372875                   inner_to_export[arg_name] = decl2.get_name
    3038                 # else cj2 は Port (既にエラー)
     2876                # else cj2 は Port (既にエラー)
    30392877                end
    30402878              end
    3041               # å†
    3042 éƒ¨ã®åå‰ã‚’外部の名前で置換
     2879              # 内部の名前を外部の名前で置換
    30432880              inner_to_export.each{ |arg_name, exp_name|
    30442881                ### p "changing #{arg_name}=>#{exp_name}"
    30452882                # exprs.gsub!( Regexp.new("#{arg_name}[^0-9A-Za-z_]"), exp_name.to_s )
    3046                 exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
    3047                 exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
     2883                exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
     2884                exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
    30482885              }
    30492886              ### p "changed: #{exprs} #{cj_size_is.to_s}"
     
    30512888                cdl_error( "S1172 \'$1\' size_is argument mismatch with exporting one \'$2\'", a.get_name, cj.get_name )
    30522889              end
    3053             # else cj は Port (既にエラー)
     2890            # else cj は Port (既にエラー)
    30542891            end
    30552892          end
     
    30642901  end
    30652902
    3066   #=== Cell# 逆 require をチェックする
    3067   # 逆 require 指定された受け口に複数の結合がないかチェックする
    3068   # composite のå†
    3069 éƒ¨ã‚»ãƒ« (f_cloned=true) もチェックする
     2903  #=== Cell# 逆 require をチェックする
     2904  # 逆 require 指定された受け口に複数の結合がないかチェックする
     2905  # composite の内部セル (f_cloned=true) もチェックする
    30702906  def check_reverse_require
    3071     # celltype がなければチェックしない(既にエラー)
     2907    # celltype がなければチェックしない(既にエラー)
    30722908    return if @celltype == nil
    30732909    return if @b_defined == false
    30742910
    30752911    # p "check reverse require   #{@name}"
    3076     # 逆require 指定された受け口に複数の結合がないかチェック
     2912    # 逆require 指定された受け口に複数の結合がないかチェック
    30772913    @referenced_port_list.each{ |port,count|
    30782914      # p port.class, count
     
    30842920  end
    30852921
    3086   #=== Cell# require 呼び口の結合を行う
     2922  #=== Cell# require 呼び口の結合を行う
    30872923  # STAGE: S
    3088   #cp_name:: Symbol           : 呼び口名
    3089   #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
    3090   #port::  Port               : celltype の Port オブジェクト
     2924  #cp_name:: Symbol           : 呼び口名
     2925  #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
     2926  #port::  Port               : celltype の Port オブジェクト
    30912927  def set_require_join( cp_name, cell_or_ct, port )
    30922928
    3093     # set_require_join は2度呼び出される
    3094     # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
     2929    # set_require_join は2度呼び出される
     2930    # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
    30952931    # if @require_joined_list[ cp_name ] then
    30962932    #   return
     
    31092945      end
    31102946    else
    3111       # require: cell で指定
     2947      # require: cell で指定
    31122948      cell = cell_or_ct
    31132949      if @region.distance( cell.get_region ) == nil then
     
    31192955      cdl_warning( "W1003 $1 : require call port overridden in $2" , cp_name, @name )
    31202956    else
    3121       # require の join を生成(呼び口の結合)
     2957      # require の join を生成(呼び口の結合)
    31222958#      rhs = Expression.new( [ :OP_DOT, [ :IDENTIFIER, Token.new( cell.get_name, nil, nil, nil ) ],
    31232959      nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    31322968  end
    31332969
    3134   #=== Cell# Join の definition の設定とチェック
     2970  #=== Cell# Join の definition の設定とチェック
    31352971  # STAGE: S
    31362972  def set_definition_join
    3137     return if @celltype == nil    # 既にエラー:打ち切る
    3138     return if @b_defined == false # プロトタイプ宣言のみ
    3139     return if @b_checked == true  # 既に設定(チェック)済み
     2973    return if @celltype == nil    # 既にエラー:打ち切る
     2974    return if @b_defined == false # プロトタイプ宣言のみ
     2975    return if @b_checked == true  # 既に設定(チェック)済み
    31402976
    31412977    dbgPrint "set_definition_join in #{@name}\n"
    31422978
    3143     # relay allocator をたどって再å
    3144 ¥ã—ないよう、å
    3145 ˆé ­ã§ @b_checked を true にする
     2979    # relay allocator をたどって再入しないよう、先頭で @b_checked を true にする
    31462980    @b_checked = true
    31472981
     
    31492983      check_restrict_list
    31502984     
    3151       # compoiste セルのクローンされたものは、set_definition 不要
    3152       # å
    3153 ƒã® join は既に definition されている
    3154       # å
    3155 ƒã®ã‚»ãƒ«ã«ãŠã„て、代å
    3156 ¥ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„るので、二重にチェック(through適用)されてしまう
     2985      # compoiste セルのクローンされたものは、set_definition 不要
     2986      # 元の join は既に definition されている
     2987      # 元のセルにおいて、代入チェックされているので、二重にチェック(through適用)されてしまう
    31572988      @join_list.get_items.each{ |join|
    31582989        dbgPrint " set_definition_join: checking #{@name}.#{join.get_name}\n"
     
    31602991          port = @celltype.find(join.get_name)
    31612992          join.get_array_member2.each { |am|
    3162             if am == nil then   # 未結合の場合、エラーチェックは check_join
     2993            if am == nil then   # 未結合の場合、エラーチェックは check_join
    31632994              if port && ! port.is_optional? then
    3164                 # テスト用にエラーメッセージ出力
     2995                # テスト用にエラーメッセージ出力
    31652996                # cdl_error( "TEMPORAL set_definition_join: uninitialized array member"  )
    31662997              end
     
    31763007    end
    31773008
    3178     # リレー join は through プラグイン生成後にしかできない
    3179     # through 後に結合å
    3180 ˆãŒå
    3181 ¥ã‚Œæ›¿ãˆã‚‰ã‚Œã‚‹
     3009    # リレー join は through プラグイン生成後にしかできない
     3010    # through 後に結合先が入れ替えられる
    31823011    create_relay_allocator_join
    31833012
    3184     # composite セルの展開
     3013    # composite セルの展開
    31853014    if ! @in_composite && ! @f_cloned && @celltype.instance_of?( CompositeCelltype ) then
    3186       # composite セルタイプå†
    3187 ã® composite は展開しない
    3188       # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand å†
    3189 ã§å†å¸°çš„に expnad)
     3015      # composite セルタイプ内の composite は展開しない
     3016      # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand 内で再帰的に expnad)
    31903017      expand
    31913018    end
    31923019  end
    31933020
    3194   #=== Cell# composite セルの展開
    3195   # このセルが composite セルタイプ
     3021  #=== Cell# composite セルの展開
     3022  # このセルが composite セルタイプ
    31963023  def expand
    31973024
     
    31993026    dbgPrint "=====    expanding   #{@name}     =====\n"
    32003027
    3201     # composite celltype の cell を展開
     3028    # composite celltype の cell を展開
    32023029    @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    32033030
    3204     # プロトタイプが参ç
    3205 §ã•ã‚Œã¦ã„る場合、子も参ç
    3206 §ã•ã‚Œã¦ã„ることにする
     3031    # プロトタイプが参照されている場合、子も参照されていることにする
    32073032    if @f_ref then
    32083033      dbgPrint "expand: set_f_ref\n"
     
    32113036  end
    32123037
    3213   #=== Cell#å†
    3214 éƒ¨ã‚»ãƒ«ã®å—け口添数最大値を設定
     3038  #=== Cell#内部セルの受け口添数最大値を設定
    32153039  def set_max_entry_port_inner_cell
    32163040    if @cell_list == nil then
     
    32203044    dbgPrint "set_max_entry_port_inner_cell name=#{@name} entry_array_max_subscript.len=#{@entry_array_max_subscript.length}\n"
    32213045
    3222     # プロトタイプ宣言で設定されていたものを反映する
     3046    # プロトタイプ宣言で設定されていたものを反映する
    32233047    @entry_array_max_subscript.each{ |port,name|
    32243048      dbgPrint "set_entry_inner_port_max_subscript( #{port}, #{name} )\n"
     
    32273051  end
    32283052
    3229   #=== Cell#restrict を追加
     3053  #=== Cell#restrict を追加
    32303054  def add_restrict( entry_name, func_name, region_name_list )
    32313055    if @restrict_list[ entry_name ] == nil then
     
    32603084            else
    32613085              cdl_info( "I9999 $1: restrict calling domain to $2, which is same domain as the cell locates", @name, rp.to_s )
    3262               # restrict を同じドメインを指定してもよいこととする (HRP3)
    3263               # KernelDoamin å†
    3264 ã®ã‚»ãƒ«ã«å¯¾ã—、KernelDomain に restrict している場合、
    3265               # 無所属経由で結合されているが、KernelDomain から呼出すことを想定した許可
     3086              # restrict を同じドメインを指定してもよいこととする (HRP3)
     3087              # KernelDoamin 内のセルに対し、KernelDomain に restrict している場合、
     3088              # 無所属経由で結合されているが、KernelDomain から呼出すことを想定した許可
    32663089            end
    32673090          else
     
    33113134
    33123135  #=== Cell#get_callable_regions( entry_name, func_name )
    3313   # func_name=nil の場合、entry_name の可否をチェック数る
    3314   # nil が返る場合、制限されていないことを意味する
     3136  # func_name=nil の場合、entry_name の可否をチェック数る
     3137  # nil が返る場合、制限されていないことを意味する
    33153138  def get_restricted_regions( entry_name, func_name )
    33163139    # p "get_restricted_regions #{@name}"
     
    33273150
    33283151  #=== Cell#has_ineffective_restrict_specifier
    3329   # restrict 指定子が指定されていて、参ç
    3330 §ã•ã‚Œã¦ã„ない場合 true
    3331   # 参ç
    3332 §ã¯ã€HRPSVCPlugin のみ
     3152  # restrict 指定子が指定されていて、参照されていない場合 true
     3153  # 参照は、HRPSVCPlugin のみ
    33333154  def has_ineffective_restrict_specifier
    33343155    if @restrict_list.length != 0 && @b_restrict_referenced == false then
     
    33583179      puts "entry array #{port.get_name}: max subscript=#{num}"
    33593180    }
    3360     if @cell_list then   # ここで @cell_list が nil なのは Bug
     3181    if @cell_list then   # ここで @cell_list が nil なのは Bug
    33613182      (indent+1).times { print "  " }
    33623183      puts "cloned cell list:"
     
    33823203          subscript = ""
    33833204        end
    3384         # アロケータ呼び口の結合を生成
     3205        # アロケータ呼び口の結合を生成
    33853206        (indent+2).times { print "  " }
    33863207        puts "#{cp_name}#{subscript} = #{a[4+1]}"
     
    34073228# @real_singleton:: bool : has singleton cell in this composite celltype
    34083229# @real_active:: bool : has active cell in this composite celltype
    3409 # @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
     3230# @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
    34103231# @internal_allocator_list:: [ [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], ... ]
    3411 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    3412 # @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
     3232# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     3233# @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
    34133234
    34143235  @@nest_stack_index = -1
     
    34533274
    34543275    Namespace.new_compositecelltype( self )
    3455     set_namespace_path # @NamespacePath の設定
     3276    set_namespace_path # @NamespacePath の設定
    34563277
    34573278    @port_list = []
     
    34693290  # CompositeCelltype#end_of_parse
    34703291  def end_of_parse
    3471     # singleton に関するチェック
     3292    # singleton に関するチェック
    34723293    if @b_singleton && @real_singleton == nil then
    34733294      cdl_warning( "W1004 $1 : specified singleton but has no singleton in this celltype" , @name )
     
    34783299    end
    34793300
    3480     # active に関するチェック
     3301    # active に関するチェック
    34813302    if @b_active && @real_active == nil then
    34823303      cdl_error( "S1054 $1 : specified active but has no active in this celltype" , @name )
     
    34853306    end
    34863307
    3487     # @allocator_instance を設定する
     3308    # @allocator_instance を設定する
    34883309    @name_list.get_items.each{ |n|
    34893310      if n.instance_of? Port then
     
    34923313    }
    34933314
    3494     # リレーアロケータの entry 側
     3315    # リレーアロケータの entry 側
    34953316    @port_list.each{ |p|
    34963317      if p.get_port_type == :ENTRY then
     
    35063327      end
    35073328    }
    3508     # mikan relay が正しく抜けているかチェックされていない
    3509 
    3510     # callback 結合
     3329    # mikan relay が正しく抜けているかチェックされていない
     3330
     3331    # callback 結合
    35113332    @cell_list_in_composite.get_items.each{ |c|
    35123333      ct = c.get_celltype
     
    35163337    }
    35173338
    3518     # 意味解析
     3339    # 意味解析
    35193340    @cell_list_in_composite.get_items.each{ |c|
    35203341      c.set_definition_join
    35213342    }
    35223343
    3523     # cell の未結合の呼び口がないかチェック
     3344    # cell の未結合の呼び口がないかチェック
    35243345    @cell_list_in_composite.get_items.each{ |c|
    35253346      c.check_join
     
    35273348    }
    35283349
    3529     # 呼び口の結合について、export とå†
    3530 éƒ¨çµåˆã®ä¸¡æ–¹ãŒãªã„かチェック
    3531     # リレーアロケータ、å†
    3532 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     3350    # 呼び口の結合について、export と内部結合の両方がないかチェック
     3351    # リレーアロケータ、内部アロケータの設定
    35333352    @port_list.each{ |p|
    35343353      p.check_dup_init
    35353354    }
    35363355
    3537     # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
     3356    # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
    35383357    @name_list.get_items.each{ |n|
    35393358      if( @export_name_list.get_item( n.get_name ) == nil )then
     
    35423361    }
    35433362
    3544     # å†
    3545 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’設定する
     3363    # 内部アロケータを設定する
    35463364    @internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    35473365      res = ext_alloc_ent.get_allocator_rhs_elements( :INTERNAL_ALLOC )
     
    35643382    }
    35653383
    3566     # composite プラグイン
     3384    # composite プラグイン
    35673385    if @generate then
    35683386      celltype_plugin
     
    35793397    cell.set_owner self  # Cell (in_omposite)
    35803398    @cell_list_in_composite.add_item( cell )
    3581     if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
     3399    if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
    35823400      if cell.get_celltype.is_singleton? then
    35833401        @real_singleton = cell
     
    36013419    @cell_list << cell
    36023420
    3603     # セルタイププラグインの適用
     3421    # セルタイププラグインの適用
    36043422    celltype_plugin_new_cell cell
    36053423  end
    36063424
    3607   #=== CompositeCelltype# CompositeCelltypeJoin を作成
     3425  #=== CompositeCelltype# CompositeCelltypeJoin を作成
    36083426  # STAGE: B
    3609   #export_name:: Symbol : 外部にå
    3610 ¬é–‹ã™ã‚‹åå‰
    3611   #internal_cell_name:: Symbol : å†
    3612 éƒ¨ã‚»ãƒ«å
    3613   #internal_cell_elem_name:: Symbol : å†
    3614 éƒ¨ã‚»ãƒ«ã®è¦ç´ åï¼ˆå‘¼ã³å£åã€å—け口名、属性名のいずれか)
    3615   #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
    3616   #RETURN:: Decl | Port : エクスポート定義
    3617   # new_join は
    3618   #   cCall => composite.cCall;     (セルå†
    3619 )
    3620   #   attr = composite.attr;        (セルå†
    3621 )
    3622   #   composite.eEnt => cell2.eEnt; (セル外)
    3623   # の構文要素の出現に対して呼び出される
     3427  #export_name:: Symbol : 外部に公開する名前
     3428  #internal_cell_name:: Symbol : 内部セル名
     3429  #internal_cell_elem_name:: Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか)
     3430  #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
     3431  #RETURN:: Decl | Port : エクスポート定義
     3432  # new_join は
     3433  #   cCall => composite.cCall;     (セル内)
     3434  #   attr = composite.attr;        (セル内)
     3435  #   composite.eEnt => cell2.eEnt; (セル外)
     3436  # の構文要素の出現に対して呼び出される
    36243437  def new_join( export_name, internal_cell_name,
    36253438                 internal_cell_elem_name, type )
     
    36343447
    36353448    celltype = cell.get_celltype
    3636     return if celltype == nil   # celltype == nil ならすでにエラー
    3637 
    3638     # å†
    3639 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—から対応要素を探す
    3640     # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
    3641     # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
     3449    return if celltype == nil   # celltype == nil ならすでにエラー
     3450
     3451    # 内部セルのセルタイプから対応要素を探す
     3452    # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
     3453    # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
    36423454    obj = celltype.find( internal_cell_elem_name )
    36433455    if obj.instance_of?( Decl ) then
     
    36473459      elsif type != :ATTRIBUTE then
    36483460        cdl_error( "S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute" , export_name )
    3649         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3461        # return 次のエラーを避けるために処理続行し、付け加えてみる
    36503462      end
    36513463    elsif obj.instance_of?( Port ) then
    36523464      if obj.get_port_type != type then
    36533465        cdl_error( "S1060 \'$1\' : port type mismatch. $2 type is allowed here." , export_name, type )
    3654         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3466        # return 次のエラーを避けるために処理続行し、付け加えてみる
    36553467      end
    36563468    else
     
    36603472    end
    36613473
    3662     # エクスポート定義と一致するかどうかチェック
     3474    # エクスポート定義と一致するかどうかチェック
    36633475    obj2 = @name_list.get_item( export_name )
    36643476    if( obj2 == nil )then
     
    36763488        elsif obj.get_signature != obj2.get_signature then
    36773489          if obj.get_signature != nil && obj2.get_signature != nil then
    3678             # nil ならば既にエラーなので報告しない
     3490            # nil ならば既にエラーなので報告しない
    36793491            cdl_error( "S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'" , export_name, obj.get_signature.get_name, obj2.get_signature.get_name )
    36803492          end
     
    37053517    if obj.instance_of?( Decl ) then
    37063518      # attribute
    3707 #      # å†
    3708 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3519#      # 内部から外部へ複数の結合がないかチェック
    37093520#      found = false
    37103521#      @attr_list.each{ |a|
     
    37193530    else
    37203531      # call/entry port
    3721 #      # å†
    3722 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3532#      # 内部から外部へ複数の結合がないかチェック
    37233533#      found = false
    37243534#      @port_list.each{ |port|
     
    37333543    end
    37343544
    3735     # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
     3545    # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
    37363546    if obj.instance_of?( Decl ) && @export_name_list.get_item( export_name ) then
    3737       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3547      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    37383548    elsif obj.instance_of?( Port ) && obj.get_port_type == :CALL && @export_name_list.get_item( export_name ) then
    3739       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3549      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    37403550    else
    37413551      @export_name_list.add_item( join )
    37423552    end
    37433553
    3744     # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
     3554    # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
    37453555    if obj2.instance_of? Port then
    37463556      obj2.each_param{ |port, fd, par|
    3747         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3557        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    37483558        when :SEND, :RECEIVE
    3749           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3750           #            ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     3559          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3560          #            ポート名         関数名         パラメータ名
    37513561          cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}"
    37523562
    3753           # リレーアロケータ or å†
    3754 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3755           # この時点では get_allocator_instance では得られないため tmp を得る
     3563          # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3564          # この時点では get_allocator_instance では得られないため tmp を得る
    37563565          if port.get_allocator_instance_tmp then
    37573566            found = false
     
    37613570
    37623571                if s[0] == :INTERNAL_ALLOC then
    3763                   # å†
    3764 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®å ´åˆ    # mikan これはå†
    3765 éƒ¨ã®ã‚»ãƒ«ã«ç›´çµã™ã‚‹ã€‚外部のポートに改めるべき
     3572                  # 内部アロケータの場合    # mikan これは内部のセルに直結する。外部のポートに改めるべき
    37663573                  @internal_allocator_list << [ cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3] ]
    37673574                end
     
    37733580          end
    37743581
    3775           # 外部アロケータの場合
     3582          # 外部アロケータの場合
    37763583          new_join( cp_name, internal_cell_name, cp_internal_name, :CALL )
    37773584        end
     
    37793586    end
    37803587
    3781     # エクスポート定義を返す
     3588    # エクスポート定義を返す
    37823589    return obj2
    37833590  end
     
    38013608    @name_list.add_item port
    38023609
    3803     # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
    3804     # この時点ではå†
    3805 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‹ã©ã†ã‹åˆ¤æ–­ã§ããªã„ので、とりあえず生成しておく
     3610    # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
     3611    # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく
    38063612    port.each_param { |port, fd, par|
    3807       case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3613      case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    38083614      when :SEND, :RECEIVE
    3809         #### リレーアロケータ or å†
    3810 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3811         # å†
    3812 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3813         # この時点では get_allocator_instance では得られないため tmp を得る
     3615        #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3616        # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3617        # この時点では get_allocator_instance では得られないため tmp を得る
    38143618        if port.get_allocator_instance_tmp then
    38153619          found = false
     
    38263630
    38273631        if par.get_allocator then
    3828           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3829           #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    3830           alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
    3831           array_size = port.get_array_size            # 呼び口または受け口é
    3832 åˆ—のサイズ
    3833           created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     3632          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3633          #           ポート名          関数名         パラメータ名
     3634          alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
     3635          array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     3636          created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    38343637          created_port.set_allocator_port( port, fd, par )
    38353638          if port.is_omit? then
    38363639            created_port.set_omit
    38373640          end
    3838           new_port( created_port )           # セルタイプに新しい呼び口を追加
     3641          new_port( created_port )           # セルタイプに新しい呼び口を追加
    38393642        # else
    38403643        #   already error
     
    38533656    attribute.each { |a|
    38543657      a.set_owner self   # Decl (CompositeCelltype)
    3855       # V1.1.0.10 composite の attr の size_is は可となった
     3658      # V1.1.0.10 composite の attr の size_is は可となった
    38563659      # if a.get_size_is then
    38573660      #  cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name )
     
    38643667  end
    38653668
    3866   #=== CompositeCelltype# 逆require の結合を生成する
     3669  #=== CompositeCelltype# 逆require の結合を生成する
    38673670  def create_reverse_require_join cell
    38683671    @name_list.get_items.each{ |n|
     
    38893692    return @name_list.get_item( name )
    38903693
    3891     # 従来仕様
     3694    # 従来仕様
    38923695#    cj = @export_name_list.get_item( name )
    38933696#p "#{name}, #{cj.get_port_decl}"
     
    38993702  end
    39003703
    3901   #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
     3704  #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
    39023705  #name:: string:
    3903   # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
     3706  # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
    39043707  def find_export name
    39053708    return @export_name_list.get_item( name )
    39063709  end
    39073710
    3908   #=== CompositeCelltype# composite celltype の cell を展開
    3909   #name:: string: Composite cell の名前
    3910   #global_name:: string: Composite cell の global name (C 言語名)
    3911   #join_list:: NamedList : Composite cell に対する Join の NamedList
     3711  #=== CompositeCelltype# composite celltype の cell を展開
     3712  #name:: string: Composite cell の名前
     3713  #global_name:: string: Composite cell の global name (C 言語名)
     3714  #join_list:: NamedList : Composite cell に対する Join の NamedList
    39123715  #RETURN:
    39133716  # [ { name => cell }, [ cell, ... ] ]
    3914   #  戻り値 前は 名前⇒cloneされたå†
    3915 éƒ¨ã‚»ãƒ«ã€å¾Œã‚ã¯ composite の出現順のリスト
     3717  #  戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト
    39163718  def expand( name, global_name, namespacePath, join_list, region, plugin, locale )
    39173719
     
    39223724    }
    39233725 
    3924     # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
     3726    # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
    39253727    clone_cell_list = {}
    39263728    clone_cell_list2 = []
    39273729    clone_cell_list3 = {}
    39283730
    3929     #  composite å†
    3930 éƒ¨ã®ã™ã¹ã¦ã® cell について
     3731    #  composite 内部のすべての cell について
    39313732    @cell_list_in_composite.get_items.each { |c|
    39323733
     
    39343735      dbgPrint "expand : cell #{c.get_name}\n"
    39353736
    3936       # Join のé
    3937 åˆ—
     3737      # Join の配列
    39383738      ja = []
    39393739
    3940       # CompositeCelltype が export する呼び口、受け口、属性のリストについて
     3740      # CompositeCelltype が export する呼び口、受け口、属性のリストについて
    39413741      # @export_name_list.get_items.each{ |cj|  # cj: CompositeCelltypeJoin
    3942       # 新仕様では、@export_name_list にå
    3943 ¥ã£ã¦ã„ない attr がありうる
     3742      # 新仕様では、@export_name_list に入っていない attr がありうる
    39443743      (@port_list+@attr_list).each{ |cj|        # cj: CompositeCelltypeJoin
    39453744
     
    39473746        dbgPrint "        cj : #{cj.get_name}\n"
    39483747
    3949         # CompositeCelltypeJoin (export) の対象セルか?
     3748        # CompositeCelltypeJoin (export) の対象セルか?
    39503749        if cj.match?( c ) then
    39513750
    3952           # 対象セルå†
    3953 ã® CompositeCelltype の export する Join (attribute または call port)
     3751          # 対象セル内の CompositeCelltype の export する Join (attribute または call port)
    39543752          j = join_list.get_item( cj.get_name )
    39553753
     
    39623760
    39633761          if j then
    3964             # 呼び口、属性の場合
    3965             #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
     3762            # 呼び口、属性の場合
     3763            #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
    39663764            # p "expand: cloning Join #{j.get_name} #{@name} #{name}"
    39673765            jc = j.clone_for_composite( @name, name, locale )
     
    39713769            # p "cn #{jc.get_name} #{cj.get_cell_elem_name}"
    39723770
    3973             # 対象セルの呼び口または属性の名前に変更
     3771            # 対象セルの呼び口または属性の名前に変更
    39743772            jc.change_name( cj.get_cell_elem_name )
    39753773
    3976             # 対象セルに対する Join のé
    3977 åˆ—
     3774            # 対象セルに対する Join の配列
    39783775            ja << jc
    39793776          end
     
    39873784      dbgPrint "expand : clone #{name}_#{c.get_name}\n"
    39883785
    3989       # セルの clone を生成
     3786      # セルの clone を生成
    39903787#      clone_cell_list[ "#{name}_#{c.get_name}" ] =  c.clone_for_composite( name, global_name, ja )
    39913788      c2 =  c.clone_for_composite( name, global_name, namespacePath, ja, @name, region, plugin, locale )
     
    39983795    clone_cell_list.each { |nm,c|
    39993796      dbgPrint "  cloned: #{nm} = #{c.get_global_name}\n"
    4000       # join の owner を clone されたセルに変更する V1.1.0.25
     3797      # join の owner を clone されたセルに変更する V1.1.0.25
    40013798      c.get_join_list.get_items.each{ |j|
    40023799        j.set_cloned( clone_cell_list[ "#{c.get_local_name}" ] )
     
    40113808  end
    40123809
    4013   #=== CompositeCelltype 指定子リストの設定
     3810  #=== CompositeCelltype 指定子リストの設定
    40143811  def set_specifier_list( spec_list )
    40153812    return if spec_list == nil
     
    40513848
    40523849  def get_var_list
    4053     []   # 空のé
    4054 åˆ—を返す
     3850    []   # 空の配列を返す
    40553851  end
    40563852
     
    40603856
    40613857  #== CompositeCelltype#get_real_celltype
    4062   # port_name に接続されているå†
    4063 éƒ¨ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—ã‚’å¾—ã‚‹
     3858  # port_name に接続されている内部のセルタイプを得る
    40643859  def get_real_celltype( port_name )
    40653860    cj = find_export port_name
     
    40723867  end
    40733868
    4074   #== CompositeCelltype# generate 指定子のæƒ
    4075 å ±
    4076   # CompositeCelltype には generate が指定できないので nil を返す
    4077   # Celltype::@generate を参ç
    4078 §ã®ã“と
     3869  #== CompositeCelltype# generate 指定子の情報
     3870  # CompositeCelltype には generate が指定できないので nil を返す
     3871  # Celltype::@generate を参照のこと
    40793872  def get_celltype_plugin
    40803873    nil
     
    40893882  end
    40903883
    4091   #=== CompositeCelltype# アクティブではない
    4092   # active ではないに加え、å
    4093 ¨ã¦ã®å†
    4094 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—が inactive の場合に inactive
    4095   # (å†
    4096 éƒ¨ã®ã‚»ãƒ«ãŒ active または factory を持っている)
     3884  #=== CompositeCelltype# アクティブではない
     3885  # active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive
     3886  # (内部のセルが active または factory を持っている)
    40973887  def is_inactive?
    40983888    if @b_active == false then
    40993889      @cell_list_in_composite.get_items.each{ |c|
    41003890        if c.get_celltype && c.get_celltype.is_inactive? == false then
    4101           # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
     3891          # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
    41023892          return false
    41033893        end
     
    41393929
    41403930
    4141 #== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
     3931#== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
    41423932class Port < BDNode
    41433933# @name::  str
     
    41453935# @port_type::  :CALL, :ENTRY
    41463936# @array_size:: nil: not array, "[]": sizeless, Integer: sized array
    4147 # @reverse_require_cell_path:: NamespacePath :     é€†require呼びå
    4148 ƒã‚»ãƒ«  mikan namespace (呼び口のみ指定可能)
    4149 # @reverse_require_callport_name:: Symbol:  逆require呼びå
    4150 ƒã‚»ãƒ«ã®å‘¼ã³å£å
     3937# @reverse_require_cell_path:: NamespacePath :     逆require呼び元セル  mikan namespace (呼び口のみ指定可能)
     3938# @reverse_require_callport_name:: Symbol:  逆require呼び元セルの呼び口名
    41513939#
    4152 # set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
    4153 # @allocator_port:: Port : この呼び口ができるå
    4154 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口
    4155 # @allocator_func_decl:: Decl : この呼び口ができるå
    4156 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口の関数
    4157 # @allocator_param_decl:: ParamDecl : この呼び口ができるå
    4158 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口のパラメータ
     3940# set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
     3941# @allocator_port:: Port : この呼び口ができる元となった呼び口または受け口
     3942# @allocator_func_decl:: Decl : この呼び口ができる元となった呼び口または受け口の関数
     3943# @allocator_param_decl:: ParamDecl : この呼び口ができる元となった呼び口または受け口のパラメータ
    41593944#
    4160 # set_specifier によって設定される(
     3945# set_specifier によって設定される(
    41613946# @allocator_instance:: Hash : {"func_param" => [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]}
    41623947#                                               [:INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
     
    41643949#                                                                                    function    parameter   rhs
    41653950#
    4166 # @b_require:: bool : require により生成された call port の場合 true
    4167 # @b_has_name:: bool : require : 名前ありのリクワイア呼び口
    4168 # @b_inline:: bool : entry port のみ
    4169 # @b_omit:: bool : omit 指定子が指定された (call port のみ)
    4170 # @b_optional:: bool : call port のみ
    4171 # @b_ref_desc:: bool :  ref_desc キーワードが指定された
    4172 # @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
     3951# @b_require:: bool : require により生成された call port の場合 true
     3952# @b_has_name:: bool : require : 名前ありのリクワイア呼び口
     3953# @b_inline:: bool : entry port のみ
     3954# @b_omit:: bool : omit 指定子が指定された (call port のみ)
     3955# @b_optional:: bool : call port のみ
     3956# @b_ref_desc:: bool :  ref_desc キーワードが指定された
     3957# @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
    41733958#
    41743959# optimize::
    4175 # @celltype:: 属するセルタイプ
     3960# @celltype:: 属するセルタイプ
    41763961#
    4177 # :CALL の場合の最適化
    4178 # @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
    4179 # @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    4180 # @b_cell_unique:: bool                     # 呼びå
    4181 ˆã¯å”¯ä¸€ã®ã‚»ãƒ«
    4182 # @only_callee_port:: Port                  # 唯一の呼びå
    4183 ˆãƒãƒ¼ãƒˆ
    4184 # @only_callee_cell:: Cell                  # 唯一の呼びå
    4185 ˆã‚»ãƒ« (@b_PEPDES_in_CB_useless = true の時有効)
     3962# :CALL の場合の最適化
     3963# @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
     3964# @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3965# @b_cell_unique:: bool                     # 呼び先は唯一のセル
     3966# @only_callee_port:: Port                  # 唯一の呼び先ポート
     3967# @only_callee_cell:: Cell                  # 唯一の呼び先セル (@b_PEPDES_in_CB_useless = true の時有効)
    41863968#
    4187 # :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
    4188 # @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
    4189 # @b_skelton_useless:: bool                 # スケルトン関数不要
     3969# :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
     3970# @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
     3971# @b_skelton_useless:: bool                 # スケルトン関数不要
    41903972
    41913973  def initialize( name, sig_path, port_type, array_size = nil, reverse_require_cell_path = nil, reverse_require_entry_port_name = nil )
     
    42033985        @array_size = array_size.eval_const(nil)
    42043986      else
    4205         @array_size = array_size   # これはアロケータ呼び口の場合(å
    4206 ƒã®å‘¼ã³å£ã§æ—¢ã«è©•ä¾¡æ¸ˆã¿ï¼‰
     3987        @array_size = array_size   # これはアロケータ呼び口の場合(元の呼び口で既に評価済み)
    42073988      end
    42083989      if @array_size == nil then
     
    42194000    object = Namespace.find( sig_path )    #1
    42204001    if object == nil then
    4221       # mikan signature の名前が不完å
    4222 ¨
     4002      # mikan signature の名前が不完全
    42234003      cdl_error( "S1075 \'$1\' signature not found" , sig_path )
    42244004    elsif ! object.instance_of?( Signature ) then
    4225       # mikan signature の名前が不完å
    4226 ¨
     4005      # mikan signature の名前が不完全
    42274006      cdl_error( "S1076 \'$1\' not signature" , sig_path )
    42284007    else
     
    42314010    end
    42324011
    4233     # 逆require
     4012    # require
    42344013    @reverse_require_cell_path       = nil
    42354014    @reverse_require_entry_port_name = nil
     
    42414020        @reverse_require_entry_port_name = reverse_require_entry_port_name
    42424021
    4243         # 受け口é
    4244 åˆ—か?
     4022        # 受け口配列か?
    42454023        if array_size then
    42464024          cdl_error( "S1153 $1: cannot be entry port array for fixed join port", @name )
    42474025        end
    42484026
    4249         # 呼び口のセルタイプを探す
     4027        # 呼び口のセルタイプを探す
    42504028        ct_or_cell = Namespace.find( @reverse_require_cell_path )  #1
    42514029        if ct_or_cell.instance_of? Cell then
     
    42624040
    42634041        if ct == nil then
    4264           return    # 既にエラー
    4265         end
    4266 
    4267         # 添え字なしの呼び口é
    4268 åˆ—か?
     4042          return    # 既にエラー
     4043        end
     4044
     4045        # 添え字なしの呼び口配列か?
    42694046        port = ct.find( @reverse_require_entry_port_name )
    42704047        if port == nil || port.get_port_type != :CALL
     
    42894066  end
    42904067
    4291   #=== Port#最適化に関する変数をリセットする
    4292   # Region ごとに最適化のやりなおしをするため、リセットする
     4068  #=== Port#最適化に関する変数をリセットする
     4069  # Region ごとに最適化のやりなおしをするため、リセットする
    42934070  def reset_optimize
    42944071    if @port_type == :CALL then
    42954072      # call port optimize
    4296       @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    4297       @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    4298       @b_cell_unique = false                     # 唯一の呼びå
    4299 ˆã‚»ãƒ«
    4300       @only_callee_port = nil                    # 唯一の呼びå
    4301 ˆãƒãƒ¼ãƒˆ
    4302       @only_callee_cell = nil                    # 唯一の呼びå
    4303 ˆã‚»ãƒ«
     4073      @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     4074      @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4075      @b_cell_unique = false                     # 唯一の呼び先セル
     4076      @only_callee_port = nil                    # 唯一の呼び先ポート
     4077      @only_callee_cell = nil                    # 唯一の呼び先セル
    43044078    else
    43054079      # entry port optimize
    43064080      if $unopt || $unopt_entry then
    4307         # 最適化なし
    4308         @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    4309         @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4081        # 最適化なし
     4082        @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     4083        @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    43104084      else
    4311         # 最適化あり
    4312         @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
    4313         @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4085        # 最適化あり
     4086        @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
     4087        @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
    43144088      end
    43154089    end
     
    43404114  end
    43414115
    4342   #=== Port# アロケータポートの設定
    4343   #port:: Port : send/receive のあった呼び口または受け口
    4344   #fd:: Decl : 関数の declarator
    4345   #par:: ParamDecl : send/receive のあった引数
    4346   # この呼び口が生成されるもとになった呼び口または受け口のæƒ
    4347 å ±ã‚’設定
     4116  #=== Port# アロケータポートの設定
     4117  #port:: Port : send/receive のあった呼び口または受け口
     4118  #fd:: Decl : 関数の declarator
     4119  #par:: ParamDecl : send/receive のあった引数
     4120  # この呼び口が生成されるもとになった呼び口または受け口の情報を設定
    43484121  def set_allocator_port( port, fd, par )
    43494122    @allocator_port = port
     
    43774150  end
    43784151
    4379   #=== Port# require 呼び口が名前を持つ?
    4380   # require 限定
     4152  #=== Port# require 呼び口が名前を持つ?
     4153  # require 限定
    43814154  def has_name?
    43824155    @b_has_name
     
    43914164  end
    43924165
    4393   #=== Port# omit 指定されている?
     4166  #=== Port# omit 指定されている?
    43944167  def is_omit?
    43954168    @b_omit || ( @signature && @signature.is_empty? )
     
    44004173  end
    44014174
    4402   def set_VMT_useless                     # VMT 関数テーブルを使用しない
     4175  def set_VMT_useless                     # VMT 関数テーブルを使用しない
    44034176   @b_VMT_useless = true
    44044177  end
    44054178
    4406   def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4179  def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    44074180    @b_skelton_useless = true
    44084181  end
    44094182
    4410   def set_cell_unique                     # 呼びå
    4411 ˆã‚»ãƒ«ã¯ä¸€ã¤ã ã‘
     4183  def set_cell_unique                     # 呼び先セルは一つだけ
    44124184    @b_cell_unique = true
    44134185  end
    44144186
    4415   #=== Port# 呼び口/受け口の指定子の設定
    4416   # inline, allocator の指定
     4187  #=== Port# 呼び口/受け口の指定子の設定
     4188  # inline, allocator の指定
    44174189  def set_specifier spec_list
    44184190    spec_list.each { |s|
     
    44674239        dyn_ref = "ref_desc"
    44684240      end
    4469       if @b_omit then     # is_omit? は is_empty? も含んでいるので使えない
     4241      if @b_omit then     # is_omit? は is_empty? も含んでいるので使えない
    44704242        cdl_error( "S9999 omit cannot be specified with $1", dyn_ref  )
    44714243      elsif @signature && @signature.is_empty? then
     
    44804252  end
    44814253
    4482   #=== Port# リレーアロケータ、å†
    4483 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’設定
    4484   # 呼び口の前方参ç
    4485 §å¯èƒ½ãªã‚ˆã†ã«ã€ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の解釈の最後で行う
     4254  #=== Port# リレーアロケータ、内部アロケータのインスタンスを設定
     4255  # 呼び口の前方参照可能なように、セルタイプの解釈の最後で行う
    44864256  def set_allocator_instance
    44874257    if @allocator_instance_tmp == nil then
     
    44964266      case alloc_type
    44974267      when :INTERNAL_ALLOC
    4498         if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
    4499           cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
     4268        if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
     4269          cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
    45004270          next
    45014271        end
     
    45044274        # OK
    45054275      when :NORMAL_ALLOC
    4506         # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
     4276        # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
    45074277        cdl_error( "S1174 $1 not suitable for lhs, suitable lhs: 'func.param'", "#{ai[1]}.#{ai[3]}.#{ai[4]}" )
    45084278        next
     
    45114281      end
    45124282
    4513       # '=' 左辺(func_name,param_name)は実在するか?
    4514       if @signature then       # signature = nil なら既にエラー
     4283      # '=' 左辺(func_name,param_name)は実在するか?
     4284      if @signature then       # signature = nil なら既にエラー
    45154285        fh = @signature.get_function_head( ai[1] )
    45164286        if fh == nil then
     
    45204290        decl = fh.get_declarator
    45214291        if ! decl.is_function? then
    4522           next   # 既にエラー
     4292          next   # 既にエラー
    45234293        end
    45244294        paramdecl = decl.get_type.get_paramlist.find( ai[2] )
     
    45374307      end
    45384308
    4539       # 重複指定がないか?
     4309      # 重複指定がないか?
    45404310      if @allocator_instance[ "#{@name}_#{ai[1]}_#{ai[2]}" ] then
    45414311        cdl_error( "S1085 duplicate allocator specifier for \'$1_$2\'" , ai[1], ai[2] )
    45424312      end
    45434313
    4544       # 右辺のチェック
     4314      # 右辺のチェック
    45454315      case alloc_type
    45464316      when :INTERNAL_ALLOC
     
    45524322        end
    45534323
    4554         ep_name = ele[1]   # アロケータ受け口名
     4324        ep_name = ele[1]   # アロケータ受け口名
    45554325        ep = @owner.find ep_name.get_path[0]  # mikan "a::b"
    45564326        if ep == nil || ! ep.instance_of?( Port ) || ep.get_port_type != :ENTRY || ! ep.get_signature.is_allocator? then
    45574327          cdl_error( "S1175 $1 not found or not allocator entry port for $2" , ep_name, ai[1] )
    45584328        end
    4559         # 右辺チェック終わり
     4329        # 右辺チェック終わり
    45604330        # ai2 = [ :INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
    45614331        ai2 = [ ai[0], ai[1], ai[2], ep_name ]
     
    45694339          #    ele[0]    ele[1][0]  ele[1][1][0]  ele[1][1][1]        ele[1][2]    ele[2]
    45704340          #      name_space_path.Token(1).Token(2) === call_port.func.param
    4571           #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
     4341          #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
    45724342
    45734343          cdl_error( "S1176 rhs not in 'call_port.func.param' form for for $1_$2" , ai[1], ai[2] )   # S1086
     
    45754345        end
    45764346        func_name = ele[1][2]; cp_name = ele[1][1][1].get_name; param_name = ele[2].to_sym
    4577         cp = @owner.find cp_name    # リレーするå
    4578 ˆã®å‘¼ã³å£
     4347        cp = @owner.find cp_name    # リレーする先の呼び口
    45794348        if cp then
    4580 # mikan cp が呼び口であることのチェック(属性の場合もある)
    4581 # mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事é 
    4582 ï¼ˆå‘¼ã³å£å´ã§ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ãŒæ±ºå®šã•ã‚Œã‚‹ï¼‰
     4349# mikan cp が呼び口であることのチェック(属性の場合もある)
     4350# mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事項(呼び口側でアロケータが決定される)
    45834351          sig = cp.get_signature
    45844352          if sig && @signature then
     
    45904358            decl = fh.get_declarator
    45914359            if ! decl.is_function? then
    4592               next   # 既にエラー
     4360              next   # 既にエラー
    45934361            end
    45944362            paramdecl = decl.get_type.get_paramlist.find( param_name )
     
    46094377
    46104378            # else
    4611             # sig == nil ならば既にエラー
     4379            # sig == nil ならば既にエラー
    46124380          end
    46134381        else
     
    46204388          next
    46214389        end
    4622         # 右辺チェック終わり
     4390        # 右辺チェック終わり
    46234391        # ai2 = [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]
    46244392        ai2 = [ ai[0], ai[1], ai[2], cp_name, func_name, param_name ]
     
    46334401  end
    46344402
    4635   def is_VMT_useless?                     # VMT 関数テーブルを使用しない
     4403  def is_VMT_useless?                     # VMT 関数テーブルを使用しない
    46364404    if @port_type == :ENTRY && $unopt_entry == true then
    4637       # プラグインから $unopt_entry を設定するケースのため
    4638       # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
     4405      # プラグインから $unopt_entry を設定するケースのため
     4406      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
    46394407      return false
    46404408    else
     
    46434411  end
    46444412
    4645   def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4413  def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    46464414    if @port_type == :ENTRY && $unopt_entry == true then
    4647       # プラグインから $unopt_entry を設定するケースのため
    4648       # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
     4415      # プラグインから $unopt_entry を設定するケースのため
     4416      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
    46494417      return false
    46504418    else
     
    46534421  end
    46544422
    4655   def is_cell_unique?                     # 呼びå
    4656 ˆã®ã‚»ãƒ«ã¯ä¸€ã¤ï¼Ÿ
     4423  def is_cell_unique?                     # 呼び先のセルは一つ?
    46574424    @b_cell_unique
    46584425  end
    46594426
    4660   #=== Port# 受け口最適化の設定
    4661   # この受け口を参ç
    4662 §ã™ã‚‹å‘¼ã³å£ãŒ VMT, skelton をå¿
    4663 è¦ã¨ã—ているかどうかを設定
    4664   # 一つでも呼び口がå¿
    4665 è¦ã¨ã—ている(すなわち b_*_useless が false)場合は、
    4666   # この受け口の最適化を false とする
     4427  #=== Port# 受け口最適化の設定
     4428  # この受け口を参照する呼び口が VMT, skelton を必要としているかどうかを設定
     4429  # 一つでも呼び口が必要としている(すなわち b_*_useless が false)場合は、
     4430  # この受け口の最適化を false とする
    46674431  def set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    46684432    if ! b_VMT_useless then
     
    46744438  end
    46754439
    4676   #=== Port# 唯一の結合å
    4677 ˆã‚’設定
    4678   # 最適化で使用
    4679   #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
    4680   #  optional の場合 callee_cell, callee_port が nil となる
     4440  #=== Port# 唯一の結合先を設定
     4441  # 最適化で使用
     4442  #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
     4443  #  optional の場合 callee_cell, callee_port が nil となる
    46814444  def set_only_callee( callee_port, callee_cell )
    46824445    @only_callee_port = callee_port
     
    46844447  end
    46854448
    4686   #=== Port# 唯一の結合å
    4687 ˆãƒãƒ¼ãƒˆã‚’返す(compositeの場合実セル)
    4688   # optional 呼び口で未結合の場合 nil を返す
     4449  #=== Port# 唯一の結合先ポートを返す(compositeの場合実セル)
     4450  # optional 呼び口で未結合の場合 nil を返す
    46894451  def get_real_callee_port
    46904452    if @only_callee_cell then
     
    46934455  end
    46944456
    4695   #=== Port# 唯一の結合å
    4696 ˆã‚»ãƒ«ã‚’返す(compositeの場合実セル)
    4697   # optional 呼び口で未結合の場合 nil を返す
     4457  #=== Port# 唯一の結合先セルを返す(compositeの場合実セル)
     4458  # optional 呼び口で未結合の場合 nil を返す
    46984459  def get_real_callee_cell
    46994460    if @only_callee_cell then
     
    47104471  end
    47114472
    4712   #=== Port# 逆require の結合を生成する
     4473  #=== Port# 逆require の結合を生成する
    47134474  # STAGE: S
    47144475  def create_reverse_require_join cell
     
    47174478    end
    47184479
    4719     # 呼びå
    4720 ƒã‚»ãƒ«ã‚’探す
     4480    # 呼び元セルを探す
    47214481    ct_or_cell = Namespace.find( @reverse_require_cell_path )   # mikan namespace    #1
    47224482    if ct_or_cell.instance_of? Cell then
     
    47244484      ct = cell2.get_celltype
    47254485      if ct == nil then
    4726         return    # 既にエラー
     4486        return    # 既にエラー
    47274487      end
    47284488    elsif ct_or_cell.instance_of? Celltype then
     
    47344494      ct = ct_or_cell
    47354495    else
    4736       # 既にエラー:無視
     4496      # 既にエラー:無視
    47374497      return
    47384498    end
    47394499
    4740     # 結合を生成する
     4500    # 結合を生成する
    47414501    dbgPrint "create_reverse_require_join #{cell2.get_name}.#{@reverse_require_entry_port_name}[] = #{cell.get_name}.#{@name}"
    47424502    nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    47504510  end
    47514511
    4752   #=== Port# signature のすべての関数のすべてのパラメータをたどる
    4753   #block:: ブロックを引数として取る(ruby の文法で書かない)
    4754   #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
    4755   # Signature クラスにも each_param がある(同じ働き)
    4756   def each_param # ブロック引数{  |port, func_decl, param_decl| }
    4757     return if @signature == nil                         # signature 未定義(既にエラー)
    4758     fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数é
    4759 åˆ—
    4760     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    4761 
    4762     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4763 ¥
     4512  #=== Port# signature のすべての関数のすべてのパラメータをたどる
     4513  #block:: ブロックを引数として取る(ruby の文法で書かない)
     4514  #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
     4515  # Signature クラスにも each_param がある(同じ働き)
     4516  def each_param # ブロック引数{  |port, func_decl, param_decl| }
     4517    return if @signature == nil                         # signature 未定義(既にエラー)
     4518    fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数配列
     4519    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     4520
     4521    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    47644522    port = self
    4765     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    4766 åˆ—中の各関数頭部
    4767       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    4768       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    4769         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     4523    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     4524      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     4525      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     4526        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    47704527          pr.call( port, fd, par )
    47714528        }
     
    47744531  end
    47754532
    4776   #=== Port# 逆require指定されている?
     4533  #=== Port# 逆require指定されている?
    47774534  def is_reverse_required?
    47784535    @reverse_require_cell_path != nil
     
    48264583#== Namespace
    48274584#
    4828 # root namespace だけ、Region クラスのインスタンスとして生成される
    4829 # root namespace は、root region をå
    4830 ¼ã­ã‚‹ãŸã‚
     4585# root namespace だけ、Region クラスのインスタンスとして生成される
     4586# root namespace は、root region を兼ねるため
    48314587#
    4832 # @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
     4588# @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
    48334589#
    48344590class Namespace < NSBDNode
    4835 # @name::  Symbol     # root の場合 "::" (String)
     4591# @name::  Symbol     # root の場合 "::" (String)
    48364592# @global_name:: str
    48374593# @name_list:: NamedList   Signature,Celltype,CompositeCelltype,Cell,Typedef,Namespace
    48384594# @struct_tag_list:: NamedList : StructType
    4839 # @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
     4595# @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
    48404596# @signature_list:: Sginature[]
    48414597# @celltype_list:: Celltype[]
     
    48434599# @cell_list:: Cell[]
    48444600# @typedef_list:: Typedef[]
    4845 # @decl_list:: ( Typedef | StructType | EnumType )[]   ä¾å­˜é–¢ä¿‚がある場合に備えて、順番どおりにé
    4846 åˆ—に格納 mikan enum
     4601# @decl_list:: ( Typedef | StructType | EnumType )[]   依存関係がある場合に備えて、順番どおりに配列に格納 mikan enum
    48474602# @const_decl_list:: Decl[]
    4848 # @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
    4849 # @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
    4850 
    4851   # mikan namespace の push, pop
    4852 
    4853   # namespace 階層用のスタック
     4603# @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
     4604# @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
     4605
     4606  # mikan namespace push, pop
     4607
     4608  # namespace 階層用のスタック
    48544609  @@namespace_stack = []      # @@namespace_stack[0] = "::" (generator.rb)
    48554610  @@namespace_sp = -1
    48564611
    4857   # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
     4612  # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
    48584613  @@nest_stack_index = -1
    48594614  @@nest_stack = []
     
    48614616  @@root_namespace = nil
    48624617
    4863   # Generator ネスト用スタックの push, pop (クラスメソッド)
     4618  # Generator ネスト用スタックの push, pop (クラスメソッド)
    48644619  def self.push
    48654620    dbgPrint "push Namespace\n"
     
    48814636  end
    48824637
    4883   # namespace 階層用スタックの push, pop (インスタンスメソッド)
     4638  # namespace 階層用スタックの push, pop (インスタンスメソッド)
    48844639  def push ns
    48854640    @@namespace_sp += 1
     
    49034658    if( name == "::" )then
    49044659      if( @@root_namespace != nil )then
    4905         # root は一回のみ生成できる
     4660        # root は一回のみ生成できる
    49064661        raise "try to re-create root namespace"
    49074662      end
     
    49124667      if ns.kind_of? Namespace then
    49134668        dbgPrint "namespace: re-appear #{@name}\n"
    4914         # 登録済み namespace の再登録
     4669        # 登録済み namespace の再登録
    49154670        ns.push ns
    49164671        return
     
    49234678    end
    49244679
    4925     if @@namespace_sp >= 0 then   # root は除外
     4680    if @@namespace_sp >= 0 then   # root は除外
    49264681      @@namespace_stack[@@namespace_sp].new_namespace( self )
    49274682    end
    49284683    push self
    49294684
    4930     @global_name = Namespace.get_global_name    # stack 登録後取る
     4685    @global_name = Namespace.get_global_name    # stack 登録後取る
    49314686    @name_list = NamedList.new( nil, "symbol in namespace '#{@name}'" )
    49324687    @struct_tag_list = NamedList.new( nil, "struct tag" )
     
    49434698    @cache_generating_region = nil
    49444699    if @NamespacePath == nil then
    4945       # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
    4946       set_namespace_path # @NamespacePath の設定
     4700      # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
     4701      set_namespace_path # @NamespacePath の設定
    49474702    end
    49484703  end
     
    49564711  end
    49574712
    4958   #=== Namespace:: global_name を得る
    4959   # parse 中のみこのメソッドは使える
     4713  #=== Namespace:: global_name を得る
     4714  # parse 中のみこのメソッドは使える
    49604715  # STAGE: P
    4961   def self.get_global_name    # parse 中有効
     4716  def self.get_global_name    # parse 中有効
    49624717    if @@namespace_sp <= 0 then
    49634718      return ""
     
    49784733  end
    49794734
    4980   #=== Namespace#セルの個数を得る
    4981   # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
    4982   # プロトタイプ宣言のもののみの個数を含めない
    4983   # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
    4984   # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
     4735  #=== Namespace#セルの個数を得る
     4736  # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
     4737  # プロトタイプ宣言のもののみの個数を含めない
     4738  # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
     4739  # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
    49854740  def get_n_cells
    49864741    if @cache_generating_region == $generating_region then
    4987       # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
     4742      # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
    49884743      return @cache_n_cells
    49894744    end
     
    49914746    count = 0
    49924747    @cell_list.each{ |c|
    4993       # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
     4748      # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
    49944749      if c.get_f_def == true then
    49954750        # print "get_n_cells: cell: #{c.get_name}\n"
     
    50024757        count += ns.get_n_cells
    50034758      else
    5004         # ns は Region である
     4759        # ns は Region である
    50054760        rt = ns.get_region_type
    50064761        # print "get_n_cells: region: #{ns.get_name}: #{rt}\n"
    50074762        if rt == :NODE || rt == :LINKUNIT then
    5008           # 別の linkunit なので加算しない
     4763          # 別の linkunit なので加算しない
    50094764        else
    50104765          count += ns.get_n_cells
     
    50184773  end
    50194774
    5020   #=== Namespace.find : in_path で示されるオブジェクトを探す
     4775  #=== Namespace.find : in_path で示されるオブジェクトを探す
    50214776  #in_path:: NamespacePath
    5022   #in_path:: Array : 古い形式
     4777  #in_path:: Array : 古い形式
    50234778  #  path [ "::", "ns1", "ns2" ]   absolute
    50244779  #  path [ "ns1", "ns2" ]         relative
     
    50354790      if name == "::" then
    50364791        i = 1
    5037         name = path[i]   # 構文的にå¿
    5038 ãšå­˜åœ¨
     4792        name = path[i]   # 構文的に必ず存在
    50394793        object = @@root_namespace.find( name )  # root
    50404794      else
    5041         # 相対パス
     4795        # 相対パス
    50424796        i = 0
    50434797        object = @@namespace_stack[@@namespace_sp].find_one( name ) # crrent
     
    50724826
    50734827      unless object.kind_of?( Namespace ) then
    5074         # クラスメソッドå†
    5075 ã§ cdl_error を呼び出すことはできない
    5076         # また、前方参ç
    5077 §å¯¾å¿œå¾Œã€æ­£ç¢ºãªè¡Œç•ªå·ãŒå‡ºãªã„問題も生じる
     4828        # クラスメソッド内で cdl_error を呼び出すことはできない
     4829        # また、前方参照対応後、正確な行番号が出ない問題も生じる
    50784830        # cdl_error( "S1092 \'$1\' not namespace" , name )
    5079         # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
     4831        # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
    50804832        return nil
    50814833      end
     
    50934845  end
    50944846
    5095   #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
     4847  #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
    50964848  def self.find_one( name )
    50974849    return @@namespace_stack[@@namespace_sp].find_one( name )
     
    51014853
    51024854    object = find( name )
    5103     # これは出すぎ
     4855    # これは出すぎ
    51044856    # dbgPrint "in '#{@name}' find '#{name}' object #{object ? object.class : "Not found"}\n"
    51054857
     
    51184870
    51194871  def self.find_tag( name )
    5120     # mikan tag : namespace の path に対応しない
    5121     # namespace の中にあっても、root namespace にあるものと見なされる
    5122     # よって カレント namespace から根に向かって探す
     4872    # mikan tag : namespace の path に対応しない
     4873    # namespace の中にあっても、root namespace にあるものと見なされる
     4874    # よって カレント namespace から根に向かって探す
    51234875    i = @@namespace_sp
    51244876    while i >= 0
     
    51964948  end
    51974949
    5198   #=== Namespace# 参ç
    5199 §ã•ã‚Œã¦ã„るが、未定義のセルを探す
    5200   # プロトタイプ宣言だけで定義されていないケースをエラーとする
    5201   # 受動の未結合セルについて警告する
     4950  #=== Namespace# 参照されているが、未定義のセルを探す
     4951  # プロトタイプ宣言だけで定義されていないケースをエラーとする
     4952  # 受動の未結合セルについて警告する
    52024953  def check_ref_but_undef
    52034954    @cell_list.each { |c|
    5204       if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
     4955      if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
    52054956        if c.get_f_ref then
    52064957          c.cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
     
    52254976  end
    52264977
    5227   #=== Namespace# セルの受け口の参ç
    5228 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
     4978  #=== Namespace# セルの受け口の参照カウントを設定する
    52294979  def set_port_reference_count
    52304980    @cell_list.each { |c|
     
    52424992
    52434993  def new_structtype( struct )
    5244     # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
     4994    # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
    52454995    dup = @struct_tag_list.get_item(struct.get_name)
    52464996    if dup != nil then
    52474997      if struct.same? dup then
    5248         # 同じものが typedef された
     4998        # 同じものが typedef された
    52494999        # p "#{struct.get_name}"
    52505000        return
     
    52705020      if typedef_type.get_type_str == dup_type.get_type_str &&
    52715021          typedef_type.get_type_str_post == dup_type.get_type_str_post then
    5272         # 同じものが typedef された
    5273         # ここへ来るのは C で関数ポインタを typedef しているケース
    5274         # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
     5022        # 同じものが typedef された
     5023        # ここへ来るのは C で関数ポインタを typedef しているケース
     5024        # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
    52755025        #    typedef long LONG;
    52765026        #    typedef long LONG;
    5277         # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
     5027        # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
    52785028        # p "#{typedef.get_declarator.get_type.get_type_str} #{typedef.get_name} #{typedef.get_declarator.get_type.get_type_str_post}"
    52795029        return
     
    53165066  def new_const_decl( decl )
    53175067    decl.set_owner self   # Decl (Namespace:const)
    5318     if ! decl.is_const? then                    # const 修飾さていること
     5068    if ! decl.is_const? then                    # const 修飾さていること
    53195069      if decl.is_type?( PtrType ) then
    53205070        cdl_error( "S1094 $1: pointer is not constant. check \'const\'" , decl.get_name )
     
    53245074    elsif ! decl.is_type?( IntType ) && ! decl.is_type?( FloatType ) &&
    53255075        ! decl.is_type?( BoolType ) && ! decl.is_type?( PtrType ) then
    5326                                             # IntType, FloatType であること
     5076                                            # IntType, FloatType であること
    53275077      cdl_error( "S1096 $1: should be int, float, bool or pointer type" , decl.get_name )
    5328     elsif decl.get_initializer == nil then   # 初期値を持つこと
     5078    elsif decl.get_initializer == nil then   # 初期値を持つこと
    53295079      cdl_error( "S1097 $1: has no initializer" , decl.get_name )
    5330 #    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
    5331 #                                            # mikan 初期値が型に対し適切であること
     5080#    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
     5081#                                            # mikan 初期値が型に対し適切であること
    53325082#      cdl_error( "S1098 $1: has unsuitable initializer" , decl.get_name )
    53335083    else
     
    53515101 ###
    53525102
    5353   #=== Namespace# すべてのセルの require ポートを設定
     5103  #=== Namespace# すべてのセルの require ポートを設定
    53545104  # STAGE: S
    53555105  def set_require_join
     
    53575107      ct.set_require_join
    53585108    }
    5359     # すべての namespace について require ポートをセット
     5109    # すべての namespace について require ポートをセット
    53605110    @namespace_list.each{ |ns|
    53615111      ns.set_require_join
     
    53635113  end
    53645114
    5365   #=== Namespace# Join への definition の設定とチェック
    5366   # セルタイプに属するすべてのセルに対して実施
     5115  #=== Namespace# Join への definition の設定とチェック
     5116  # セルタイプに属するすべてのセルに対して実施
    53675117  def set_definition_join
    5368     # celltype のコードを生成
     5118    # celltype のコードを生成
    53695119    @cell_list.each { |c|
    53705120      dbgPrint "set_definition_join #{c.get_name}\n"
     
    53775127
    53785128  #=== Namespace# set_max_entry_port_inner_cell
    5379   # セルタイプに属するすべてのセルに対して実施
     5129  # セルタイプに属するすべてのセルに対して実施
    53805130  def set_max_entry_port_inner_cell
    5381     # celltype のコードを生成
     5131    # celltype のコードを生成
    53825132    @cell_list.each { |c|
    53835133      c.set_max_entry_port_inner_cell
     
    53885138  end
    53895139
    5390   #=== Namespace# セルの結合をチェックする
     5140  #=== Namespace# セルの結合をチェックする
    53915141  def check_join
    53925142    @cell_list.each { |c|
     
    54005150  end
    54015151
    5402   #== Namespace# ルートか?
    5403   # ルートネームスペース と ルートリージョンは同じ
     5152  #== Namespace# ルートか?
     5153  # ルートネームスペース と ルートリージョンは同じ
    54045154  def is_root?
    54055155    @name == "::"
    54065156  end
    54075157
    5408   #== Namespace# ルートを得る
    5409   # ルートリージョンとルートネームスペースは同じオブジェクト
     5158  #== Namespace# ルートを得る
     5159  # ルートリージョンとルートネームスペースは同じオブジェクト
    54105160  def self.get_root
    54115161    @@root_namespace
    54125162  end
    54135163
    5414   #== Namespace (Region) に属するセルのリスト
     5164  #== Namespace (Region) に属するセルのリスト
    54155165  def get_cell_list
    54165166    @cell_list
    54175167  end
    54185168
    5419   #== Namespace (Region)# 子リージョンのリスト
     5169  #== Namespace (Region)# 子リージョンのリスト
    54205170  #
    5421   # リージョンは Namespace クラスで namespace として記憶されている
     5171  # リージョンは Namespace クラスで namespace として記憶されている
    54225172  def get_region_list
    54235173    @namespace_list
     
    54415191#
    54425192# available if definition is Port
    5443 # @cell_name:: string : 右辺のセルの名前
    5444 # @cell:: Cell  : 右辺のセル
    5445 # @celltype:: Celltype : 右辺のセルタイプ
    5446 # @port_name:: string : 右辺の受け口名
    5447 # @port:: Port : 右辺の受け口
     5193# @cell_name:: string : 右辺のセルの名前
     5194# @cell:: Cell  : 右辺のセル
     5195# @celltype:: Celltype : 右辺のセルタイプ
     5196# @port_name:: string : 右辺の受け口名
     5197# @port:: Port : 右辺の受け口
    54485198# @array_member:: rhs array : available only for first appear in the same name
    54495199# @array_member2:: Join array : available only for first appear in the same name
    5450 # @rhs_subscript:: nil : not array, >=0: 右辺の添数
     5200# @rhs_subscript:: nil : not array, >=0: 右辺の添数
    54515201#
    54525202
    54535203# @through_list::  @cp_through_list + @region_through_list
    5454 #  以下の構造を持つ(@cp_through_list の構造はå
    5455 ±é€šï¼‰
    5456 # @cp_through_list::  呼び口に指定された through
     5204#  以下の構造を持つ(@cp_through_list の構造は共通)
     5205# @cp_through_list::  呼び口に指定された through
    54575206#   [ [plugin_name, cell_name, plugin_arg], [plugin_name2, cell_name2, plugin_arg], ... ]
    5458 # @region_through_list::  region に指定された through
     5207# @region_through_list::  region に指定された through
    54595208#   [ [plugin_name, cell_name, plugin_arg, region], [plugin_name2, cell_name2, plugin_arg, region2], ... ]
    54605209#
    5461 # @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
    5462 # @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
     5210# @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
     5211# @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
    54635212#
    54645213
    54655214  include PluginModule
    54665215
    5467   #=== Join# 初期化
    5468   #name:: string: 名前(属性名、呼び口名)
    5469   #subscript:: Nil=非é
    5470 åˆ—, -1="[]", N="[N]"
    5471   #rhs:: Expression: 右辺の式
     5216  #=== Join# 初期化
     5217  #name:: string: 名前(属性名、呼び口名)
     5218  #subscript:: Nil=非配列, -1="[]", N="[N]"
     5219  #rhs:: Expression: 右辺の式
    54725220  def initialize( name, subscript, rhs, locale = nil )
    54735221    # dbgPrint "Join#new: #{name}, #{subscript} #{rhs.eval_const(nil)}\n"
     
    54815229    @name = name
    54825230    if subscript.instance_of?( Expression ) then
    5483        #mikan é
    5484 åˆ—添数が整数であることを未チェック
     5231       #mikan 配列添数が整数であることを未チェック
    54855232       @subscript = subscript.eval_const(nil)
    54865233       if @subscript == nil then
     
    54945241    @definition = nil
    54955242
    5496     # é
    5497 åˆ—要素を設定
    5498     # 本当は、初出の要素のみ設定するのが適当
    5499     # new_join で add_array_member の中で初出要素の array_member に対し設定する
     5243    # 配列要素を設定
     5244    # 本当は、初出の要素のみ設定するのが適当
     5245    # new_join で add_array_member の中で初出要素の array_member に対し設定する
    55005246    if @subscript == -1 then
    55015247      @array_member  = [self]
     
    55155261  end
    55165262
    5517   #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
     5263  #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
    55185264  # STAGE:   S
    55195265  #
    5520   #     ä»£å
    5521 ¥å¯èƒ½ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹
    5522   #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
     5266  #     代入可能かチェックする
     5267  #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
    55235268
    55245269  def set_definition( definition )
     
    55265271    dbgPrint "set_definition: #{@owner.get_name}.#{@name} = #{definition.class}\n"
    55275272
    5528     # 二重チェックの防止
     5273    # 二重チェックの防止
    55295274    if @definition then
    5530       # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
    5531       # 二重に set_definition が実行されると through が二重に適用されてしまう
     5275      # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
     5276      # 二重に set_definition が実行されると through が二重に適用されてしまう
    55325277      # cdl_warning( "W9999 $1, internal error: set_definition duplicate", @name )
    55335278      return
     
    55365281    @definition = definition
    55375282
    5538     # mikan 左辺値、右辺値の型チェックなど
     5283    # mikan 左辺値、右辺値の型チェックなど
    55395284    if @definition.instance_of?( Decl ) then
    55405285      check_var_init
    55415286    elsif @definition.instance_of?( Port ) then
    55425287      check_call_port_init
    5543       if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
     5288      if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
    55445289        check_and_gen_through
    5545         create_allocator_join  # through プラグイン生成した後でないと、挿å
    5546 ¥å‰ã®ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’結合してしまう
     5290        create_allocator_join  # through プラグイン生成した後でないと、挿入前のセルのアロケータを結合してしまう
    55475291      end
    55485292    elsif @definition == nil then
     
    55535297  end
    55545298
    5555   #=== Join# 変数の初期化チェック
     5299  #=== Join# 変数の初期化チェック
    55565300  def check_var_init
    5557     # attribute, var の場合
     5301    # attribute, var の場合
    55585302    if @definition.get_kind == :ATTRIBUTE then
    55595303#        check_cell_cb_init( definition.get_type, @rhs )
    5560       # 右辺で初期化可能かチェック
     5304      # 右辺で初期化可能かチェック
    55615305      @definition.get_type.check_init( @locale, @definition.get_identifier, @rhs, :ATTRIBUTE )
    55625306    elsif @definition.get_kind == :VAR then
    5563       # var は初期化できない
     5307      # var は初期化できない
    55645308      cdl_error( "S1100 $1: cannot initialize var" , @name )
    55655309    else
     
    55695313  end
    55705314
    5571   #=== Join# 呼び口の初期化チェック
     5315  #=== Join# 呼び口の初期化チェック
    55725316  def check_call_port_init
    55735317    ### Port
    55745318
    5575     # 左辺は受け口か(受け口を初期化しようとしている)?
     5319    # 左辺は受け口か(受け口を初期化しようとしている)?
    55765320    if @definition.get_port_type == :ENTRY then
    55775321      cdl_error( "S1101 \'$1\' cannot initialize entry port" , @name )
     
    55795323    end
    55805324
    5581 #      # é
    5582 åˆ—添数の整合性チェック
    5583 #      # 呼び口の定義で、非é
    5584 åˆ—なら添数なし、添数なしé
    5585 åˆ—なら添数なし、添数ありé
    5586 åˆ—なら添数あり
     5325#      # 配列添数の整合性チェック
     5326#      # 呼び口の定義で、非配列なら添数なし、添数なし配列なら添数なし、添数あり配列なら添数あり
    55875327    as = @definition.get_array_size
    55885328    if ( @subscript == nil && as != nil ) then
     
    56075347#    end
    56085348
    5609     # mikan Expression の get_type で型導出させる方がスマート
    5610     # mikan '=' の左辺がé
    5611 åˆ—かどうか未チェック
    5612     #(1) '=' の右辺は "Cell.ePort" の形式か?
    5613     #     æ¼”算子は "."  かつ "." の左辺が :IDENTIFIER
    5614     #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
    5615     #(2) "Cell" は存在するか?(名前が一致するものはあるか)
    5616     #(3) "Cell" は cell か?
    5617     #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
    5618     #(5) "ePort" は "Cell" の celltype å†
    5619 ã«å­˜åœ¨ã™ã‚‹ã‹ï¼Ÿ
    5620     #(6) "ePort" は entry port か?
    5621     #(7) signature は一致するか
    5622 
    5623     # 右辺がない(以前の段階でエラー)
     5349    # mikan Expression の get_type で型導出させる方がスマート
     5350    # mikan '=' の左辺が配列かどうか未チェック
     5351    #(1) '=' の右辺は "Cell.ePort" の形式か?
     5352    #     演算子は "."  かつ "." の左辺が :IDENTIFIER
     5353    #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
     5354    #(2) "Cell" は存在するか?(名前が一致するものはあるか)
     5355    #(3) "Cell" は cell か?
     5356    #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
     5357    #(5) "ePort" は "Cell" の celltype 内に存在するか?
     5358    #(6) "ePort" は entry port か?
     5359    #(7) signature は一致するか
     5360
     5361    # 右辺がない(以前の段階でエラー)
    56245362    return unless @rhs
    56255363
    5626     # cCall = composite.cCall; のチェック.この形式は属性用
    5627     # 呼び口を export するには cCall => composite.cCall; の形式を用いる
     5364    # cCall = composite.cCall; のチェック.この形式は属性用
     5365    # 呼び口を export するには cCall => composite.cCall; の形式を用いる
    56285366    if @rhs.instance_of?( Array ) == true && @rhs[0] == :COMPOSITE then
    56295367      cdl_error( "S1107 to export port, use \'cCall => composite.cCall\'"  )
     
    56335371    end
    56345372
    5635     # 右辺の Expression の要素を取り出す
     5373    # 右辺の Expression の要素を取り出す
    56365374    ret = @rhs.analyze_cell_join_expression
    56375375    if ret == nil then   #1
     
    56415379
    56425380    nsp, @rhs_subscript, @port_name = ret[0], ret[1], ret[2]
    5643     @cell_name = nsp.get_name     # mikan ns::cellname の形式の考æ
    5644 ®
    5645 
    5646     # composite の定義の中なら object は結合å
    5647 ˆ cell か、見つからなければ nil が返る
    5648     # composite の定義外なら false が返る
     5381    @cell_name = nsp.get_name     # mikan ns::cellname の形式の考慮
     5382
     5383    # composite の定義の中なら object は結合先 cell か、見つからなければ nil が返る
     5384    # composite の定義外なら false が返る
    56495385    object = CompositeCelltype.find( @cell_name )
    56505386    if object == false then
    5651 #     mikan 左辺が namespace に対応していないため。 path にして find
     5387#     mikan 左辺が namespace に対応していないため。 path にして find
    56525388      # p nsp.get_path_str, nsp.get_path
    56535389      object = Namespace.find( nsp )    #1
     
    56685404      object.set_f_ref
    56695405
    5670       # 右辺のセルのセルタイプ
     5406      # 右辺のセルのセルタイプ
    56715407      celltype = object.get_celltype
    56725408
     
    56815417          cdl_error( "S1113 \'$1\' signature mismatch" , @port_name )
    56825418        elsif object2.get_array_size then
    5683           # 受け口é
    5684 åˆ—
     5419          # 受け口配列
    56855420
    56865421          unless @rhs_subscript then
    5687             # 右辺に添数指定がなかった
     5422            # 右辺に添数指定がなかった
    56885423            cdl_error( "S1114 \'$1\' should be array" , @port_name )
    56895424          else
     
    56915426            as = object2.get_array_size
    56925427            if( as.kind_of?( Integer ) && as <= @rhs_subscript )then
    5693               # 受け口é
    5694 åˆ—の大きさに対し、右辺の添数が同じか大きい
     5428              # 受け口配列の大きさに対し、右辺の添数が同じか大きい
    56955429              cdl_error( "S1115 $1[$2]: subscript out of range (< $3)" , @port_name, @rhs_subscript, as )
    56965430            else
     
    56995433              @celltype = celltype
    57005434              @port = object2
    5701               # 右辺のセルの受け口 object2 を参ç
    5702 §æ¸ˆã¿ã«ã™ã‚‹
     5435              # 右辺のセルの受け口 object2 を参照済みにする
    57035436              # object2: Port, @definition: Port
    57045437              @cell.set_entry_port_max_subscript( @port, @rhs_subscript )
     
    57105443          end
    57115444        elsif @rhs_subscript then
    5712           # 受け口é
    5713 åˆ—でないのに右辺で添数指定されている
     5445          # 受け口配列でないのに右辺で添数指定されている
    57145446          cdl_error( "S1116 \'$1\' entry port is not array" , @port_name )
    57155447        else
     
    57195451          @celltype = celltype
    57205452
    5721           # 右辺のセル object の受け口 object2 を参ç
    5722 §æ¸ˆã¿ã«ã™ã‚‹
     5453          # 右辺のセル object の受け口 object2 を参照済みにする
    57235454          # object2: Port, @definition: Port
    57245455
    57255456          # debug
    57265457          # p "rhs:  #{@cell}  #{@cell.get_name}"
    5727         end  # end of port (object2) チェック
     5458        end  # end of port (object2) チェック
    57285459
    57295460        #else
    5730         #  celltype == nil (すでにエラー)
    5731       end  # end of celltyep チェック
     5461        #  celltype == nil (すでにエラー)
     5462      end  # end of celltyep チェック
    57325463
    57335464
    57345465      check_region( object )
    57355466
    5736     end  # end of cell (object) チェック
    5737 
    5738   end
    5739 
    5740   #=== Join# アロケータの結合を生成
     5467    end  # end of cell (object) チェック
     5468
     5469  end
     5470
     5471  #=== Join# アロケータの結合を生成
    57415472  # STAGE: S
    5742   #cell::  呼び口の結合å
    5743 ˆã®ã‚»ãƒ«
     5473  #cell::  呼び口の結合先のセル
    57445474  #
    5745   # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
    5746   # 受け口側は Cell の set_specifier_list で生成
    5747   #  a[*] のå†
    5748 å®¹ã¯ Cell の set_specifier_list を参ç
    5749 §
     5475  # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
     5476  # 受け口側は Cell の set_specifier_list で生成
     5477  #  a[*] の内容は Cell の set_specifier_list を参照
    57505478  def create_allocator_join
    57515479
    5752     cell = get_rhs_cell2   # 右辺のセルを得る
     5480    cell = get_rhs_cell2   # 右辺のセルを得る
    57535481    port = get_rhs_port2
    57545482
    5755     if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
     5483    if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
    57565484
    57575485      dbgPrint "create_allocator_join: #{@owner.get_name}.#{@name}=>#{cell ? cell.get_name : "nil"}\n"
     
    57605488
    57615489        if( a[0+1] == port && a[1+1] == @rhs_subscript )then
    5762           # 名前の一致するものの結合を生成する
    5763           # 過不足は、別途チェックされる
     5490          # 名前の一致するものの結合を生成する
     5491          # 過不足は、別途チェックされる
    57645492          cp_name = :"#{@name}_#{a[2+1]}_#{a[3+1]}"
    57655493          # p "creating allocator join #{cp_name} #{@subscript} #{a[1+1]}"
     
    57765504  end
    57775505
    5778   #=== Join# リージョン間の結合をチェック
    5779   # リージョン間の through による @region_through_list の作成
    5780   # 実際の生成は check_and_gen_through で行う
    5781   # mikan Cell#distance とRegion へたどり着くまでための処理にå
    5782 ±é€šéƒ¨åˆ†ãŒå¤šã„
     5506  #=== Join# リージョン間の結合をチェック
     5507  # リージョン間の through による @region_through_list の作成
     5508  # 実際の生成は check_and_gen_through で行う
     5509  # mikan Cell#distance とRegion へたどり着くまでための処理に共通部分が多い
    57835510  def check_region( object )
    57845511
     
    57875514    # print "DOMAIN: check_region #{@owner.get_name}.#{@name} => #{object.get_name}\n"
    57885515
    5789     # プラグインで生成されたなかでは生成しない
    5790     # さもないとプラグイン生成されたものとの間で、無限に生成される
     5516    # プラグインで生成されたなかでは生成しない
     5517    # さもないとプラグイン生成されたものとの間で、無限に生成される
    57915518##    if Generator.get_nest >= 1 then
    5792 ##    if Generator.get_plugin then     # mikan これはå¿
    5793 è¦ï¼Ÿ (意味解析段階での実行になるので不適切)
     5519##    if Generator.get_plugin then     # mikan これは必要? (意味解析段階での実行になるので不適切)
    57945520    if @owner.get_plugin.kind_of?( ThroughPlugin ) then
    5795       # プラグイン生成されたセルの場合、結合チェックのみ
     5521      # プラグイン生成されたセルの場合、結合チェックのみ
    57965522      return
    57975523    end
    57985524
    5799     # region のチェック
    5800     r1 = @owner.get_region      # 呼び口セルの region
    5801     r2 = object.get_region      # 受け口セルの region
    5802 
    5803     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     5525    # region のチェック
     5526    r1 = @owner.get_region      # 呼び口セルの region
     5527    r2 = object.get_region      # 受け口セルの region
     5528
     5529    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    58045530
    58055531      f1 = r1.get_family_line
     
    58085534      len2 = f2.length
    58095535
    5810       # 不一致になるところ(å
    5811 „弟)を探す
    5812       i = 1  # i = 0 は :RootRegion なのでå¿
    5813 ãšä¸€è‡´
     5536      # 不一致になるところ(兄弟)を探す
     5537      i = 1  # i = 0 は :RootRegion なので必ず一致
    58145538      while( i < len1 && i < len2 )
    58155539        if( f1[i] != f2[i] )then
     
    58195543      end
    58205544
    5821       sibling_level = i     # å
    5822 „弟となるレベル、もしくはどちらか一方が終わったレベル
     5545      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    58235546
    58245547      dbgPrint "sibling_level: #{i}\n"
     
    58335556
    58345557
    5835       # 呼び側について呼びå
    5836 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    5837 „弟レベルまで(out_through をチェックおよび挿å
    5838 ¥ï¼‰
     5558      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    58395559      i = len1 -1
    58405560      if b_to_through then
     
    58605580
    58615581        out_through_list.each { |ol|
    5862           if ol[0] then    # plugin_name が指定されていなければ登録しない
     5582          if ol[0] then    # plugin_name が指定されていなければ登録しない
    58635583            plugin_arg = CDLString.remove_dquote ol[1]
    58645584            through = [ ol[0], :"Join_out_through_", plugin_arg, f1[i], f1[i-1], :OUT_THROUGH, region_count]
     
    58735593      end
    58745594
    5875       # å
    5876 „弟レベルにおいて(to_through をチェックおよび挿å
    5877 ¥ï¼‰
     5595      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    58785596      if f1[sibling_level] && f2[sibling_level] then
    58795597        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
    58805598        found = 0
    5881         region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
     5599        region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
    58825600        f1[sibling_level].get_to_through_list.each { |t|
    5883           if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    5884             if t[1] then    # plugin_name が指定されていなければ登録しない
     5601          if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     5602            if t[1] then    # plugin_name が指定されていなければ登録しない
    58855603              plugin_arg = CDLString.remove_dquote t[2]
    58865604              through = [ t[1], :"Join_to_through__", plugin_arg, f1[sibling_level], f2[sibling_level], :TO_THROUGH, region_count ]
     
    59055623      end
    59065624
    5907       # 受け側についてå
    5908 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    5909 ¥ï¼‰
     5625      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    59105626      if b_to_through then
    5911         i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
     5627        i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
    59125628      else
    59135629        i = sibling_level
     
    59325648        end
    59335649        in_through_list.each { |il|
    5934           if il[0] then    # plugin_name が指定されていなければ登録しない
     5650          if il[0] then    # plugin_name が指定されていなければ登録しない
    59355651            plugin_arg = CDLString.remove_dquote il[1]
    59365652            through = [ il[0], :"Join_in_through_", plugin_arg, f2[i-1], f2[i],:IN_THROUGH, region_count ]
     
    59455661
    59465662
    5947   #=== Join# 生成しないリージョンへの結合かチェック
    5948   # 右辺のセルが、生成されないリージョンにあればエラー
    5949   # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
     5663  #=== Join# 生成しないリージョンへの結合かチェック
     5664  # 右辺のセルが、生成されないリージョンにあればエラー
     5665  # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
    59505666  def check_region2
    59515667    lhs_cell = @owner
    59525668
    5953     # 生成しないリージョンのセルへの結合か?
     5669    # 生成しないリージョンのセルへの結合か?
    59545670    # if join.get_cell && ! join.get_cell.is_generate? then
    5955     # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
     5671    # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
    59565672    # print "Link root: (caller #{@owner.get_name}) '#{@owner.get_region.get_link_root.get_name}'"
    59575673    # print " #{@owner.get_region.get_link_root == get_rhs_region.get_link_root ? "==" : "!="} "
     
    59665682      end
    59675683    else
    5968       # rhs のセルが存在しなかった (既にエラー)
     5684      # rhs のセルが存在しなかった (既にエラー)
    59695685    end
    59705686  end
     
    59745690  end
    59755691
    5976   #=== Join# specifier を設定
     5692  #=== Join# specifier を設定
    59775693  # STAGE: B
    5978   # set_specifier_list は、join の解析の最後で呼び出される
    5979   # through 指定子を設定
    5980   #  check_and_gen_through を呼出して、through 生成
     5694  # set_specifier_list は、join の解析の最後で呼び出される
     5695  # through 指定子を設定
     5696  #  check_and_gen_through を呼出して、through 生成
    59815697  def set_specifier_list( specifier_list )
    59825698
     
    59865702        # set plugin_name
    59875703        plugin_name = s[1].to_s
    5988         plugin_name[0] = "#{plugin_name[/^./].upcase}"     # å
    5989 ˆé ­æ–‡å­—を大文字に : ruby のクラス名の制約
     5704        plugin_name[0] = "#{plugin_name[/^./].upcase}"     # 先頭文字を大文字に : ruby のクラス名の制約
    59905705
    59915706        # set cell_name
     
    59945709        # set plugin_arg
    59955710        plugin_arg = CDLString.remove_dquote s[2].to_s
    5996         # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
     5711        # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
    59975712        # plugin_arg.sub!( /(.*)"\z/, '\1' )
    59985713
     
    60035718  end
    60045719
    6005   #=== Join# through のチェックと生成
    6006   # new_join の中の check_region で region 間の through が @region_through に設定される
    6007   # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
    6008   # その後、このメソッドが呼ばれる
     5720  #=== Join# through のチェックと生成
     5721  # new_join の中の check_region で region 間の through が @region_through に設定される
     5722  # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
     5723  # その後、このメソッドが呼ばれる
    60095724  def check_and_gen_through
    60105725
     
    60275742
    60285743    @through_list = @cp_through_list + @region_through_list
    6029       # 後から @cp_through_list と @region_through_list に分けたため、このような実è£
    6030 ã«ãªã£ãŸ
     5744      # 後から @cp_through_list と @region_through_list に分けたため、このような実装になった
    60315745
    60325746    if @through_list then           # nil when the join is not Port
    6033       len = @through_list.length    # through が連接している数
     5747      len = @through_list.length    # through が連接している数
    60345748    else
    60355749      len = 0
     
    60425756    end
    60435757
    6044     # 連続した through について、受け口側から順にセルを生成し解釈する
     5758    # 連続した through について、受け口側から順にセルを生成し解釈する
    60455759    i = len - 1
    60465760    while i >= 0
     
    60725786
    60735787      else
    6074         # 最後のセルの場合、次のセルの名前、ポート名
     5788        # 最後のセルの場合、次のセルの名前、ポート名
    60755789        next_cell      = @cell
    60765790        next_port_name = @port_name
     
    60785792
    60795793        if next_cell == nil then
    6080           # 結合å
    6081 ˆãŒãªã„
     5794          # 結合先がない
    60825795          return
    60835796        end
     
    60855798
    60865799      if i >= cp_len then
    6087         # region_through_list 部分
    6088         # region から @cell_name.@port_name への through がないか探す
     5800        # region_through_list 部分
     5801        # region から @cell_name.@port_name への through がないか探す
    60895802        # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762
    60905803        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript )
    6091            # @through_list[i] と @region_through_list[i-cp_len] は同じ
    6092         # å
    6093 ±ç”¨ã—ないようにするには、見つからなかったことにすればよい
     5804           # @through_list[i] と @region_through_list[i-cp_len] は同じ
     5805        # 共用しないようにするには、見つからなかったことにすればよい
    60945806        # rp = nil
    60955807      else
    6096         # region 以外のものはå
    6097 ±æœ‰ã—ない
    6098         # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
     5808        # region 以外のものは共有しない
     5809        # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
    60995810        rp = nil
    61005811      end
     
    61065817        end
    61075818      else
    6108         # 見つかったものをå
    6109 ±ç”¨ã™ã‚‹
     5819        # 見つかったものを共用する
    61105820        @through_generated_list[ i ] = rp
    61115821      end
    61125822
    61135823      if i >= cp_len then
    6114         # @through_generated_list のうち @region_through_listに対応する部分
     5824        # @through_generated_list のうち @region_through_listに対応する部分
    61155825        @region_through_generated_list[ i - cp_len ] = @through_generated_list[ i ]
    61165826        if rp == nil then
    6117           # 生成したものを region(@through_list[i][3]) のリストに追加
     5827          # 生成したものを region(@through_list[i][3]) のリストに追加
    61185828          # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762
    61195829          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript, @through_generated_list[i] )
     
    61225832
    61235833      if i == 0 then
    6124         # 最も呼び口側のセルは、CDL 上の結合がないため、参ç
    6125 §ã•ã‚ŒãŸã“とにならない
    6126         # mikan namespace 対応
     5834        # 最も呼び口側のセルは、CDL 上の結合がないため、参照されたことにならない
     5835        # mikan namespace 対応
    61275836        # cell = Namespace.find( [ @through_generated_list[0].get_cell_name] )    #1
    61285837        if @through_generated_list[0] == nil then
    6129           return  # plugin_object の生成に失敗している
     5838          return  # plugin_object の生成に失敗している
    61305839        end
    61315840        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    61515860  end
    61525861
    6153   #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
     5862  #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
    61545863  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, next_port_subscript, plClass )
    61555864
     
    61595868    plugin_arg            = through[ 2 ]
    61605869    if through[ 3 ] then
    6161       # region 間の through の場合
     5870      # region 間の through の場合
    61625871      @@start_region      = through[ 3 ]
    61635872      if next_cell.get_region.equal? @@start_region then
     
    61695878      @@region_count      = through[ 6 ]
    61705879    else
    6171       # 呼び口の through の場合
    6172       @@start_region      = @owner.get_region    # 呼び口側セルの region
    6173       @@end_region        = next_cell.get_region # 次のセルの region
    6174       @@through_type      = :THROUGH             # 呼び口の through 指定
     5880      # 呼び口の through の場合
     5881      @@start_region      = @owner.get_region    # 呼び口側セルの region
     5882      @@end_region        = next_cell.get_region # 次のセルの region
     5883      @@through_type      = :THROUGH             # 呼び口の through 指定
    61755884      @@region_count      = 0
    61765885    end
     
    61945903    @through_generated_list[ i ] = plugin_object
    61955904
    6196     # Region に関するæƒ
    6197 å ±ã‚’設定
    6198     # 後から追加したので、new の引数外で設定
     5905    # Region に関する情報を設定
     5906    # 後から追加したので、new の引数外で設定
    61995907    # plugin_object.set_through_info( start_region, end_region, through_type )
    62005908
     
    62025910  end
    62035911
    6204   #プラグインへの引数で渡さないものを、一時的に記憶しておく
    6205   # プラグインの initialize の中でコールバックして設定する
     5912  #プラグインへの引数で渡さないものを、一時的に記憶しておく
     5913  # プラグインの initialize の中でコールバックして設定する
    62065914  @@plugin_creating_join = nil
    62075915  @@start_region = nil
     
    62105918  @@region_count = nil
    62115919
    6212   #=== Join# ThroughPlugin の追加æƒ
    6213 å ±ã‚’設定する
    6214   # このメソッドは ThroughPlugin#initialize から呼び出される
    6215   # plugin_object を生成する際の引数では不足するæƒ
    6216 å ±ã‚’追加する
     5920  #=== Join# ThroughPlugin の追加情報を設定する
     5921  # このメソッドは ThroughPlugin#initialize から呼び出される
     5922  # plugin_object を生成する際の引数では不足する情報を追加する
    62175923  def self.set_through_info plugin_object
    62185924    plugin_object.set_through_info( @@start_region, @@end_region, @@through_type,
     
    62265932  end
    62275933
    6228   #=== Join#é
    6229 åˆ—添数を得る
    6230   # @subscript の説明を参ç
    6231 §ã®ã“と
     5934  #=== Join#配列添数を得る
     5935  # @subscript の説明を参照のこと
    62325936  def get_subscript
    62335937    @subscript
    62345938  end
    62355939
    6236   def get_cell_name         # 受け口セル名
     5940  def get_cell_name         # 受け口セル名
    62375941    @cell_name
    62385942  end
     
    62465950  end
    62475951
    6248   #=== Join# 右辺の実セルを得る
    6249   #    実セルとは through で挿å
    6250 ¥ã•ã‚ŒãŸã‚‚の、composite のå†
    6251 éƒ¨ãªã©å®Ÿéš›ã«çµåˆã•ã‚Œã‚‹å
    6252 ˆ
    6253   #    このメソッドは get_rhs_port と対になっている
    6254   #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
     5952  #=== Join# 右辺の実セルを得る
     5953  #    実セルとは through で挿入されたもの、composite の内部など実際に結合される先
     5954  #    このメソッドは get_rhs_port と対になっている
     5955  #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
    62555956  def get_rhs_cell
    6256     # through 指定あり?
     5957    # through 指定あり?
    62575958    if @through_list[0] then
    6258       # mikan through で生成したものが root namespace 限定
     5959      # mikan through で生成したものが root namespace 限定
    62595960      if @through_generated_list[0] then
    62605961        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    62615962        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    6262         # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
    6263         # プラグイン生成コードがエラーになっている。
    6264         # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
     5963        # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
     5964        # プラグイン生成コードがエラーになっている。
     5965        # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
    62655966        return cell.get_real_cell( @through_generated_list[0].get_through_entry_port_name )
    62665967      else
    6267         return nil            # generate に失敗している
     5968        return nil            # generate に失敗している
    62685969      end
    62695970    elsif @cell then
    62705971      return @cell.get_real_cell( @port_name )
    62715972    else
    6272       # 右辺が未定義の場合 @cell は nil (既にエラー)
     5973      # 右辺が未定義の場合 @cell は nil (既にエラー)
    62735974      return nil
    62745975    end
    62755976  end
    62765977
    6277   #=== Join# 右辺のセルを得る
    6278   # 右辺のセルを得る。ただし、composite 展開されていない
    6279   # composite 展開されたものを得るには get_rhs_cell を使う
    6280   # プロトタイプ宣言しかされていない場合には、こちらしか使えない
    6281   # このメソッドは get_rhs_port2 と対になっている
     5978  #=== Join# 右辺のセルを得る
     5979  # 右辺のセルを得る。ただし、composite 展開されていない
     5980  # composite 展開されたものを得るには get_rhs_cell を使う
     5981  # プロトタイプ宣言しかされていない場合には、こちらしか使えない
     5982  # このメソッドは get_rhs_port2 と対になっている
    62825983  def get_rhs_cell2
    6283     # through 指定あり?
     5984    # through 指定あり?
    62845985    if @through_list[0] then
    6285       # mikan through で生成したものが root namespace 限定
     5986      # mikan through で生成したものが root namespace 限定
    62865987      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name ] )
    62875988      if @through_generated_list[0] then
     
    62895990        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    62905991      else
    6291         cell = @cell            # generate に失敗している
     5992        cell = @cell            # generate に失敗している
    62925993      end
    62935994    else
     
    62985999  end
    62996000
    6300   #=== Join# 右辺のセルを得る
    6301   # through は適用しないが、composite は展開した後のセル
    6302   # (意味解析が終わっていないと、composite 展開が終わっていない)
    6303   # このメソッドは get_rhs_port3 と対になっている
     6001  #=== Join# 右辺のセルを得る
     6002  # through は適用しないが、composite は展開した後のセル
     6003  # (意味解析が終わっていないと、composite 展開が終わっていない)
     6004  # このメソッドは get_rhs_port3 と対になっている
    63046005  def get_rhs_cell3
    63056006    if @cell then
     
    63086009  end
    63096010
    6310   #=== Join# 右辺のセルのリージョンを得る
    6311   # 右辺が未定義の場合、nil を返す
    6312   # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
    6313   # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
     6011  #=== Join# 右辺のセルのリージョンを得る
     6012  # 右辺が未定義の場合、nil を返す
     6013  # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
     6014  # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
    63146015  def get_rhs_region
    6315     # through 指定あり?
     6016    # through 指定あり?
    63166017    if @through_list[0] then
    63176018      if @through_generated_list[0] then
    6318         # mikan through で生成したものが root namespace 限定
     6019        # mikan through で生成したものが root namespace 限定
    63196020        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    63206021        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    63236024        end
    63246025      else
    6325         return nil       # generate に失敗している
     6026        return nil       # generate に失敗している
    63266027      end
    63276028    elsif @cell then
    63286029      return @cell.get_region
    63296030    end
    6330     # 右辺が未定義の場合 @cell は nil (既にエラー)
     6031    # 右辺が未定義の場合 @cell は nil (既にエラー)
    63316032    return nil
    63326033  end
    63336034
    6334   def get_cell_global_name  # 受け口セル名(コンポジットなら展開したå†
    6335 å´ã®ã‚»ãƒ«ï¼‰
     6035  def get_cell_global_name  # 受け口セル名(コンポジットなら展開した内側のセル)
    63366036
    63376037    # debug
     
    63476047  end
    63486048
    6349   #===  Join# 結合の右辺の受け口の名前
    6350   #     namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
    6351   #subscript:: Integer  呼び口é
    6352 åˆ—の時添数 または nil 呼び口é
    6353 åˆ—でない時
    6354   def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開したå†
    6355 å´ã®ã‚»ãƒ«ï¼‰
     6049  #===  Join# 結合の右辺の受け口の名前
     6050  #     namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
     6051  #subscript:: Integer  呼び口配列の時添数 または nil 呼び口配列でない時
     6052  def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開した内側のセル)
    63566053
    63576054    # debug
    63586055    dbgPrint "Cell get_port_global_name:  #{@cell_name}\n"
    63596056
    6360     # through 指定あり?
     6057    # through 指定あり?
    63616058    if @through_list[0] then
    63626059
    6363       # mikan through で生成したものが root namespace 限定
     6060      # mikan through で生成したものが root namespace 限定
    63646061      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    63656062      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    63666063
    6367       # through で挿å
    6368 ¥ã•ã‚ŒãŸã‚»ãƒ«ã§ã€å®Ÿéš›ã«æŽ¥ç¶šã•ã‚Œã‚‹ã‚»ãƒ«ï¼ˆcompositeの場合å†
    6369 éƒ¨ã®)の受け口の C 言語名前
     6064      # through で挿入されたセルで、実際に接続されるセル(compositeの場合内部の)の受け口の C 言語名前
    63706065      return cell.get_real_global_port_name( @through_generated_list[0].get_through_entry_port_name )
    63716066    else
    63726067
    6373       # 実際に接続されるセルの受け口の C 言語名前
     6068      # 実際に接続されるセルの受け口の C 言語名前
    63746069      if @cell then
    63756070        return @cell.get_real_global_port_name( @port_name )
     
    63906085  end
    63916086
    6392   # 末尾数字1 : CDL で指定された、右辺のセルを返す
    6393   def get_rhs_cell1   # get_cell と同じ
     6087  # 末尾数字1 : CDL で指定された、右辺のセルを返す
     6088  def get_rhs_cell1   # get_cell と同じ
    63946089    @cell
    63956090  end
    6396   def get_rhs_port1   # get_port_name 同じ
     6091  def get_rhs_port1   # get_port_name 同じ
    63976092    @port_name
    63986093  end
     
    64016096  end
    64026097
    6403   #=== Join# 右辺のポートを得る
    6404   #    右辺が composite の場合は、å†
    6405 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ, through の場合は挿å
    6406 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ
    6407   #    このメソッドは get_rhs_cell と対になっている
     6098  #=== Join# 右辺のポートを得る
     6099  #    右辺が composite の場合は、内部の繋がるセルのポート, through の場合は挿入されたセルのポート
     6100  #    このメソッドは get_rhs_cell と対になっている
    64086101  def get_rhs_port
    6409     # through 指定あり?
     6102    # through 指定あり?
    64106103    if @through_list[0] then
    6411       # through で生成されたセルを探す
     6104      # through で生成されたセルを探す
    64126105      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    6413       # cell のプラグインで生成されたポート名のポートを探す (composite ならå†
    6414 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆ)
     6106      # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート)
    64156107      return cell.get_real_port( @through_generated_list[0].get_through_entry_port_name )
    64166108    else
    6417       # ポートを返す(composite ならå†
    6418 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆã‚’返す)
     6109      # ポートを返す(composite なら内部の繋がるポートを返す)
    64196110      return @cell.get_real_port( @port_name )
    64206111    end
    64216112  end
    64226113
    6423   #=== Join# 右辺のé
    6424 åˆ—添数を得る
    6425   #    右辺が through の場合は挿å
    6426 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®æ·»æ•°
    6427   #    右辺が composite の場合は、å†
    6428 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆã®æ·»æ•° (composite では変わらない)
    6429   #    このメソッドは get_rhs_cell,  と対になっている
     6114  #=== Join# 右辺の配列添数を得る
     6115  #    右辺が through の場合は挿入されたセルの添数
     6116  #    右辺が composite の場合は、内部の繋がるセルのポートの添数 (composite では変わらない)
     6117  #    このメソッドは get_rhs_cell,  と対になっている
    64306118  def get_rhs_subscript
    64316119    if @through_list[0] then
     
    64366124  end
    64376125
    6438   #=== Join# 右辺のポートを得る
    6439   # 右辺のポートを得る。
    6440   # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
     6126  #=== Join# 右辺のポートを得る
     6127  # 右辺のポートを得る。
     6128  # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
    64416129  def get_rhs_port2
    6442     # through 指定あり?
     6130    # through 指定あり?
    64436131    if @through_list[0] then
    64446132      if @through_generated_list[0] then
    64456133        port = @through_generated_list[0].get_through_entry_port_name.to_sym
    64466134      else
    6447         port = @port_name    # generate に失敗している
     6135        port = @port_name    # generate に失敗している
    64486136      end
    64496137    else
     
    64546142  end
    64556143
    6456   #=== Join# 右辺のポートを得る
    6457   # through は適用しないが、composite は展開した後のセルの対応するポート
     6144  #=== Join# 右辺のポートを得る
     6145  # through は適用しないが、composite は展開した後のセルの対応するポート
    64586146  def get_rhs_port3
    64596147    if @cell then
     
    64626150  end
    64636151
    6464   #=== Join# 呼び口é
    6465 åˆ—の2番目以降の要素を追加する
    6466   #     ä¸€ç•ªæœ€åˆã«å®šç¾©ã•ã‚ŒãŸé
    6467 åˆ—要素がå
    6468 ¨è¦ç´ ã®åˆæœŸå€¤ã®é
    6469 åˆ—を持つ
    6470   #     ã“のメソッドは非é
    6471 åˆ—の場合も呼出される(join 重複エラーの場合)
    6472   #join2:: Join  呼び口é
    6473 åˆ—要素の Join
     6152  #=== Join# 呼び口配列の2番目以降の要素を追加する
     6153  #     一番最初に定義された配列要素が全要素の初期値の配列を持つ
     6154  #     このメソッドは非配列の場合も呼出される(join 重複エラーの場合)
     6155  #join2:: Join  呼び口配列要素の Join
    64746156  def add_array_member join2
    64756157
    6476     # subscript2: join2 の左辺添数
     6158    # subscript2: join2 の左辺添数
    64776159    subscript2 = join2.get_subscript
    64786160
    64796161    if @subscript == nil then           # not array : initialize duplicate
    6480       # 非é
    6481 åˆ—の場合、join が重複している
     6162      # 非配列の場合、join が重複している
    64826163      cdl_error( "S1127 \'$1\' duplicate", @name )
    64836164      # print "add_array_member2: #{@owner.get_name}\n"
    64846165
    64856166    elsif @subscript >= 0 then
    6486       # 添数指定ありの場合
     6167      # 添数指定ありの場合
    64876168      if( subscript2 == nil || subscript2 < 0 ) then
    6488         # join2 左辺は非é
    6489 åˆ—または添数なし
    6490         # é
    6491 åˆ—が不一致
     6169        # join2 左辺は非配列または添数なし
     6170        # 配列が不一致
    64926171        cdl_error( "S1128 \'$1\' inconsistent array definition", @name )
    64936172      elsif @array_member[subscript2] != nil then
    6494         # 同じ添数が既に定義済み
     6173        # 同じ添数が既に定義済み
    64956174        cdl_error( "S1129 \'$1\' redefinition of subscript $2" ,@name, subscript2 )
    64966175      else
    6497         # 添数の位置に要素を追加
     6176        # 添数の位置に要素を追加
    64986177        @array_member[subscript2] = join2.get_rhs
    64996178        @array_member2[subscript2] = join2
     
    65026181
    65036182    else
    6504       # 添数指定なしの場合
     6183      # 添数指定なしの場合
    65056184      if( subscript2 == nil || subscript2 >= 0 ) then
    6506         # join2 左辺は非é
    6507 åˆ—または添数有
    6508         # é
    6509 åˆ—が不一致
     6185        # join2 左辺は非配列または添数有
     6186        # 配列が不一致
    65106187        cdl_error( "S1130 \'R1\' inconsistent array definition", @name )
    65116188      end
    65126189
    6513       # 添数なしé
    6514 åˆ—の場合、é
    6515 åˆ—要素を追加
     6190      # 添数なし配列の場合、配列要素を追加
    65166191      @array_member  << join2.get_rhs
    65176192      @array_member2 << join2
     
    65376212      while i < @array_member2.length
    65386213        if @array_member2[i] != self && @array_member[i] != nil then
    6539           # @array_member2[i] が nil になるのは optional の時と、
    6540           # Join の initialize で無駄に @array_member2 が設定されている場合
    6541           # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6542 è¦ã¯ãªã„(clone_for_composite では対策している)
     6214          # @array_member2[i] が nil になるのは optional の時と、
     6215          # Join の initialize で無駄に @array_member2 が設定されている場合
     6216          # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    65436217          @array_member2[i].change_name( name )
    65446218        end
     
    65486222  end
    65496223
    6550   # composite cell を展開したセルの結合を clone したセルの名前に変更
     6224  # composite cell を展開したセルの結合を clone したセルの名前に変更
    65516225  def change_rhs_port( clone_cell_list, celltype )
    65526226    dbgPrint "change_rhs_port: name=#{@name}\n"
     
    65726246    dbgPrint "  REWRITE cell_name:  #{@owner.get_name}   #{@cell_name} => #{c.get_global_name}, #{c.get_name}\n"
    65736247
    6574     # @rhs のå†
    6575 å®¹ã‚’調整しておく(このå†
    6576 å®¹ã¯ã€subscript を除いて、後から使われていない)
     6248    # @rhs の内容を調整しておく(この内容は、subscript を除いて、後から使われていない)
    65776249    elements = @rhs.get_elements
    6578     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    6579 åˆ—?
     6250    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    65806251      elements  = elements[1]
    65816252    end
    65826253
    6583     # 右辺が cell.ePort の形式でない
     6254    # 右辺が cell.ePort の形式でない
    65846255    if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER then   #1
    65856256      return
    65866257    else
    6587       # セル名を composite å†
    6588 éƒ¨ã®åå‰ã‹ã‚‰ã€å¤–部の名前にå
    6589 ¥ã‚Œæ›¿ãˆã‚‹
     6258      # セル名を composite 内部の名前から、外部の名前に入れ替える
    65906259      # elements[1][1] = Token.new( c.get_name, nil, nil, nil )
    65916260      elements[1][1] = NamespacePath.new( c.get_name, false, c.get_namespace )
     
    65946263    @cell_name = c.get_name
    65956264    @cell = c
    6596     # @definition = nil          # @definition が有効: チェック済み(とは、しない)
     6265    # @definition = nil          # @definition が有効: チェック済み(とは、しない)
    65976266
    65986267    if @array_member2 then
     
    66036272      i = 0
    66046273      while i < @array_member2.length
    6605         # @array_member2[i] が nil になるのは optional の時と、
    6606         # Join の initialize で無駄に @array_member2 が設定されている場合
    6607         # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6608 è¦ã¯ãªã„(clone_for_composite では対策している)
     6274        # @array_member2[i] が nil になるのは optional の時と、
     6275        # Join の initialize で無駄に @array_member2 が設定されている場合
     6276        # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    66096277        if @array_member2[i] != self && @array_member[i] != nil then
    66106278          dbgPrint "change_rhs array_member #{i}: #{@name}  #{@cell_name}\n"
     
    66176285  end
    66186286
    6619   #=== Join# composite セル用にクローン
    6620   #cell_global_name:: string : 親セルのグローバル名
    6621   # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
    6622   # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
    6623   # (å†
    6624 éƒ¨ã‚»ãƒ«ã® C_EXP もここで置換される)
    6625   # @through_list などもコピーされるので、これが呼び出される前に確定するå¿
    6626 è¦ãŒã‚ã‚‹
     6287  #=== Join# composite セル用にクローン
     6288  #cell_global_name:: string : 親セルのグローバル名
     6289  # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
     6290  # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
     6291  # (内部セルの C_EXP もここで置換される)
     6292  # @through_list などもコピーされるので、これが呼び出される前に確定する必要がある
    66276293  def clone_for_composite( ct_name, cell_name, locale, b_need_recursive = true )
    66286294    # debug
     
    66436309
    66446310  def clone_array_member( ct_name, cell_name, prev, locale )
    6645     # é
    6646 åˆ—のコピーを作る
     6311    # 配列のコピーを作る
    66476312    am  = @array_member.clone
    66486313    am2 = @array_member2.clone
    66496314
    6650     # é
    6651 åˆ—要素のコピーを作る
     6315    # 配列要素のコピーを作る
    66526316    i = 0
    66536317    while i < am2.length
    66546318      if @array_member2[i] == prev then
    6655         # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
     6319        # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
    66566320        am2[i] = self
    66576321        am[i] = am2[i].get_rhs
     
    66616325        am[i] = am2[i].get_rhs
    66626326      else
    6663         # 以前のエラーで array_member2[i] は nil になっている
     6327        # 以前のエラーで array_member2[i] は nil になっている
    66646328      end
    66656329
     
    66706334    end
    66716335
    6672     # i = 0 は、ここで自分自身を設定
     6336    # i = 0 は、ここで自分自身を設定
    66736337    # am2[0] = self
    66746338
     
    66786342  end
    66796343
    6680   #=== Join# rhs をå
    6681 ¥ã‚Œæ›ãˆã‚‹
     6344  #=== Join# rhs を入れ換える
    66826345  #rhs:: Expression | initializer
    6683   # 右辺をå
    6684 ¥ã‚Œæ›ãˆã‚‹ï¼Ž
    6685   # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
    6686   # このメソッドは composite å†
    6687 ã® cell の属性の初期値が定数ではなく式になった場合、不要になる
     6346  # 右辺を入れ換える.
     6347  # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
     6348  # このメソッドは composite 内の cell の属性の初期値が定数ではなく式になった場合、不要になる
    66886349  def change_rhs rhs
    66896350    @rhs = rhs
    66906351  end
    66916352
    6692   #=== Join# clone された join の owner を変更
     6353  #=== Join# clone された join の owner を変更
    66936354  def set_cloned( owner )
    66946355    dbgPrint "Join#set_cloned: #{@name}  prev owner: #{@owner.get_name} new owner: #{owner.get_name}\n"
     
    67846445end
    67856446
    6786 #== 逆結合
     6447#== 逆結合
    67876448class ReverseJoin < BDNode
    67886449#@ep_name:: Symbol
     
    68096470end
    68106471
    6811 # CLASS: CompositeCelltype 用の Join
    6812 # REM:   CompositeCelltype が export するもの
     6472# CLASS: CompositeCelltype 用の Join
     6473# REM:   CompositeCelltype が export するもの
    68136474class CompositeCelltypeJoin < BDNode
    6814 # @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
    6815 # @internal_cell_name:: string : CompositeCelltype å†
    6816 éƒ¨ã®ã‚»ãƒ«ã®åå‰
    6817 # @internal_cell_elem_name:: string : CompositeCelltype å†
    6818 éƒ¨ã®ã‚»ãƒ«ã®å‘¼ã³å£ã€å—け口、属性の名前
    6819 # @cell : Cell : Cell::  internal cell  : CompositeCelltyep å†
    6820 éƒ¨ã®ã‚»ãƒ«ï¼ˆin_compositeセル)
     6475# @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
     6476# @internal_cell_name:: string : CompositeCelltype 内部のセルの名前
     6477# @internal_cell_elem_name:: string : CompositeCelltype 内部のセルの呼び口、受け口、属性の名前
     6478# @cell : Cell : Cell::  internal cell  : CompositeCelltyep 内部のセル(in_compositeセル)
    68216479# @port_decl:: Port | Decl
    68226480# @b_pseudo: bool :
     
    68336491  end
    68346492
    6835   #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
    6836   #cell::  Cell 対象かどうかチェックするセル
     6493  #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
     6494  #cell::  Cell 対象かどうかチェックするセル
    68376495  #
    6838   #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
    6839   #     port_decl が指定された場合は、現状使われていない
     6496  #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
     6497  #     port_decl が指定された場合は、現状使われていない
    68406498  def match?( cell, port_decl = nil )
    68416499
     
    68536511
    68546512#    if @cell.equal?( cell ) && ( port_decl == nil || @port_decl.equal?( port_decl ) ) then
    6855     # なぜ port_decl が一致しなければならなかったか忘れた。
    6856     # recursive_composite で名前の一致に変更   060917
     6513    # なぜ port_decl が一致しなければならなかったか忘れた。
     6514    # recursive_composite で名前の一致に変更   060917
    68576515    if((@cell.get_name == cell.get_name) && (port_decl == nil || @port_decl.get_name == port_decl.get_name))then
    68586516      true
     
    68866544  end
    68876545
    6888   # @port_decl が Port の場合のみ呼び出してよい
     6546  # @port_decl が Port の場合のみ呼び出してよい
    68896547  def get_port_type
    68906548    if @port_decl then
     
    69086566  end
    69096567
    6910   # @port_decl が Port の場合のみ呼び出してよい
     6568  # @port_decl が Port の場合のみ呼び出してよい
    69116569  def is_require?
    69126570    if @port_decl then
     
    69156573  end
    69166574
    6917   # @port_decl が Port の場合のみ呼び出してよい
     6575  # @port_decl が Port の場合のみ呼び出してよい
    69186576  def is_allocator_port?
    69196577    if @port_decl then
     
    69226580  end
    69236581
    6924   # @port_decl が Port の場合のみ呼び出してよい
     6582  # @port_decl が Port の場合のみ呼び出してよい
    69256583  def is_optional?
    69266584    if @port_decl then
     
    69296587  end
    69306588
    6931   #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
    6932   # このメソッドは Cell の check_join から初期値チェックのために呼び出される
     6589  #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
     6590  # このメソッドは Cell の check_join から初期値チェックのために呼び出される
    69336591  def get_initializer
    69346592    if @port_decl.instance_of? Decl then
     
    69436601  end
    69446602
    6945   #=== CompositeCelltypeJoin# é
    6946 åˆ—サイズを得る
    6947   #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
     6603  #=== CompositeCelltypeJoin# 配列サイズを得る
     6604  #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
    69486605  def get_array_size
    69496606    @port_decl.get_array_size
    69506607  end
    69516608
    6952   #=== CompositeCelltypeJoin# signature を得る
    6953   # @port_decl が Port の時のみ呼び出してもよい
     6609  #=== CompositeCelltypeJoin# signature を得る
     6610  # @port_decl が Port の時のみ呼び出してもよい
    69546611  def get_signature
    69556612    @port_decl.get_signature
     
    69946651# @file_name:: string
    69956652# @format:: string
    6996 # @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
     6653# @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
    69976654# @f_celltype:: bool : true: celltype factory, false: cell factory
    69986655
     
    70056662    case name
    70066663    when :write
    7007       # write 関数
     6664      # write 関数
    70086665      @name = name
    70096666
    7010       # write 関数の第一引数:出力å
    7011 ˆãƒ•ã‚¡ã‚¤ãƒ«å
    7012         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6667      # write 関数の第一引数:出力先ファイル名
     6668        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    70136669      @file_name = file_name.eval_const(nil).val  # file_name : Expression
    70146670      if ! @file_name.instance_of?( String ) then
    7015         # 文字列定数ではなかった
     6671        # 文字列定数ではなかった
    70166672        cdl_error( "S1132 $1: 1st parameter is not string(file name)" , @name )
    70176673        @file_name = nil
    70186674      end
    70196675
    7020       # write 関数の第二引数:フォーマット文字列
     6676      # write 関数の第二引数:フォーマット文字列
    70216677      @format    = format.eval_const(nil).val     # format : Expression
    7022         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6678        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    70236679      if ! @format.instance_of?( String ) then
    7024         # 文字列定数ではなかった
     6680        # 文字列定数ではなかった
    70256681        cdl_error( "S1133 $1: 2nd parameter is not string(fromat)" , @name )
    70266682        @format = nil
    70276683      end
    70286684
    7029       # 第三引数以降を引数リストとする mikan 引数のチェック
     6685      # 第三引数以降を引数リストとする mikan 引数のチェック
    70306686      @arg_list = arg_list
    70316687
     
    71046760#== DomainType
    71056761#
    7106 # region の domain を記憶するクラス
     6762# region の domain を記憶するクラス
    71076763class DomainType < Node
    7108 #@name::Symbol : ドメインタイプの名前 ex) HRP2
     6764#@name::Symbol : ドメインタイプの名前 ex) HRP2
    71096765#@region::Region
    71106766#@plugin_name::Symbol : ex) HRP2Plugin
    71116767#@option::String : ex) "trusted", "nontrusted"
    7112 #@plugin::DomainPlugin の子クラス
     6768#@plugin::DomainPlugin の子クラス
    71136769
    71146770  include PluginModule
    71156771
    7116   # ドメインに属する region の Hash
    7117   # domain 指定が一度も行われない場合、このリストは空である
    7118   # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
     6772  # ドメインに属する region の Hash
     6773  # domain 指定が一度も行われない場合、このリストは空である
     6774  # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
    71196775  @@domain_regions = { }  # { :domain_type => [ region, ... ] }
    71206776
     
    71596815  end
    71606816
    7161   #== DomainType リージョンの Hash を得る
    7162   # @@domain_regions の説明参ç
    7163 §
     6817  #== DomainType リージョンの Hash を得る
     6818  # @@domain_regions の説明参照
    71646819  def self.get_domain_regions
    71656820    return @@domain_regions
     
    71746829  end
    71756830
    7176   #== DomainType#ドメイン種別を得る
     6831  #== DomainType#ドメイン種別を得る
    71776832  #return::Symbol :kernel, :user, :OutOfDomain
    71786833  def get_kind
     
    71866841end
    71876842
    7188 #== Region クラス
     6843#== Region クラス
    71896844#
    7190 # Region は Namespace を継承している
    7191 # root region は特殊で、root namespace と同じである
     6845# Region は Namespace を継承している
     6846# root region は特殊で、root namespace と同じである
    71926847#
    7193 # cell は region に属する
    7194 # region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
     6848# cell は region に属する
     6849# region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
    71956850#
    71966851class Region < Namespace
    71976852# @name:: string
    7198 # @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
    7199 # @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
     6853# @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
     6854# @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
    72006855# @to_through_list:: [ [ dst_region, plugin_name, plugin_arg ], ... ]
    7201 # @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
    7202 #    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
     6856# @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
     6857#    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
    72036858# @region_type::Symbol : :NODE, :LINKUNIT, :DOMAIN, :CLASS
    7204 # @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
    7205 # @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
    7206 # @family_line:: [ @region_root, ...,@region_me ]  家系
    7207 # @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
    7208 # @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
    7209 # @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
    7210 # @domain_type::DomainType : domain 指定されていない場合、nil
    7211 # @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
     6859# @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
     6860# @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
     6861# @family_line:: [ @region_root, ...,@region_me ]  家系
     6862# @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
     6863# @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
     6864# @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
     6865# @domain_type::DomainType : domain 指定されていない場合、nil
     6866# @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
    72126867
    72136868  @@in_through_list  = []
     
    72176872  @@region_type_param = nil
    72186873  @@domain_name = nil
    7219   @@domain_option = nil    # Token がå
    7220 ¥ã‚‹
     6874  @@domain_option = nil    # Token が入る
    72216875
    72226876  @@link_roots = []
    72236877
    72246878  def initialize( name )
    7225     # mikan name の Namespace 修飾
    7226     # object = Namespace.find( [ name ] )   # 親まで捜しにいく
     6879    # mikan name の Namespace 修飾
     6880    # object = Namespace.find( [ name ] )   # 親まで捜しにいく
    72276881    if name != "::" then
    72286882      object = Namespace.get_current.find( name )    #1
    72296883    else
    7230       # root リージョン
     6884      # root リージョン
    72316885      object = nil
    72326886      @@region_type = :NODE
     
    72656919        dbgPrint "Region.new: re-appear #{@name}\n"
    72666920
    7267         # # Region path が前回出現と一致するか?
     6921        # # Region path が前回出現と一致するか?
    72686922        # if @@region_stack[ @@region_stack_sp - 1 ] then
    72696923        #   my_path = @@region_stack[ @@region_stack_sp - 1 ].get_path_string.to_s + "." + @name.to_s
     
    72756929        # end
    72766930
    7277         # 再出現
     6931        # 再出現
    72786932        # @@region_stack[@@region_stack_sp] = object
    72796933
    7280         # 再出現時に specifier が指定されているか?
     6934        # 再出現時に specifier が指定されているか?
    72816935        if( @in_through_list.length != 0 || @out_through_list.length != 0 || @to_through_list.length != 0 ||
    72826936            @region_type != nil || @domain_type != nil )then
     
    72866940
    72876941      else
    7288         # エラー用ダミー定義
    7289 
    7290         # 異なる同名のオブジェクトが定義済み
     6942        # エラー用ダミー定義
     6943
     6944        # 異なる同名のオブジェクトが定義済み
    72916945        cdl_error( "S1141 $1 duplication, previous one : $2" , name, object.class )
    7292         # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
    7293       end
    7294     else
    7295       # 初出現
     6946        # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
     6947      end
     6948    else
     6949      # 初出現
    72966950      dbgPrint "Region.new: #{@name}\n"
    72976951      set_region_family_line
     
    73467000  end
    73477001
    7348   #== Region ルートリージョンを得る
    7349   # ルートリージョンは、ルートネームスペースと同じである
     7002  #== Region ルートリージョンを得る
     7003  # ルートリージョンは、ルートネームスペースと同じである
    73507004  def self.get_root
    73517005    Namespace.get_root
     
    73557009
    73567010    dbgPrint  "set_region_family_line: Region: #{@name}  \n"
    7357     # root namespace (root region) の region type は :NODE
     7011    # root namespace (root region) の region type は :NODE
    73587012    if @name == "::" then
    73597013      @region_type = :NODE
     
    73737027
    73747028    if @domain_type then
    7375       # ルートリージョンが最初から @domain_type 設定されることはないの
    7376       # で @owner == nil を調べるå¿
    7377 è¦ã¯ãªã„
     7029      # ルートリージョンが最初から @domain_type 設定されることはないの
     7030      # で @owner == nil を調べる必要はない
    73787031      @owner.set_domain_type @domain_type
    73797032    end
     
    73897042    @link_root = nil
    73907043
    7391     # @family_line を作成する
    7392     # @link_root もみつける
    7393     # (上位にたどっていって Region で node または linkunit のいずれかå
    7394 ˆã«è¦‹ã¤ã‹ã£ãŸã‚‚のが @link_root となる)
    7395     # root namespace は Region かつ node なのでå¿
    7396 ãš @link_root は見つかる
    7397     # mikan: self が node, linkUnit の場合、ここで期å¾
    7398 ã—たとおりに設定されないため、Region#initialize で再設定
     7044    # @family_line を作成する
     7045    # @link_root もみつける
     7046    # (上位にたどっていって Region で node または linkunit のいずれか先に見つかったものが @link_root となる)
     7047    # root namespace は Region かつ node なので必ず @link_root は見つかる
     7048    # mikan: self が node, linkUnit の場合、ここで期待したとおりに設定されないため、Region#initialize で再設定
    73997049    obj = self
    74007050    while 1
     
    74077057        end
    74087058      else
    7409         # さもなければ Namespace
    7410         # namespace の下に region がある場合
    7411       end
    7412 
    7413       # root namespace にたどり着けば終り
     7059        # さもなければ Namespace
     7060        # namespace の下に region がある場合
     7061      end
     7062
     7063      # root namespace にたどり着けば終り
    74147064      break if obj.get_name == "::"
    74157065
     
    74227072  end
    74237073
    7424   #== Region#ドメインを設定する
     7074  #== Region#ドメインを設定する
    74257075  def set_domain_type domain_type
    74267076    if @region_type == :NODE then
     
    74667116  end
    74677117
    7468   #== Region# domain の根っことなる region を得る
    7469   # Region のインスタンスを返す
    7470   # domain 指定子があれば、そのリージョンがドメインルートである
    7471   # なければ、親リージョンのドメインルートとする
     7118  #== Region# domain の根っことなる region を得る
     7119  # Region のインスタンスを返す
     7120  # domain 指定子があれば、そのリージョンがドメインルートである
     7121  # なければ、親リージョンのドメインルートとする
    74727122  def get_domain_root
    74737123    @domain_root
     
    74937143  end
    74947144
    7495   #== Region# ルートリージョン
    7496   # ルートリージョンは、namespace のルートと同じインスタンス
     7145  #== Region# ルートリージョン
     7146  # ルートリージョンは、namespace のルートと同じインスタンス
    74977147  def selfget_root
    74987148    Namespace.get_root
     
    75157165  end
    75167166
    7517   #=== Region# 構文解析中の region を得る
    7518   # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
    7519   # cell が namespace 下におくことができなければ、ループをまわすå¿
    7520 è¦ã¯ãªã„
     7167  #=== Region# 構文解析中の region を得る
     7168  # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
     7169  # cell が namespace 下におくことができなければ、ループをまわす必要はない
    75217170  def self.get_current
    75227171    # @@region_stack[@@region_stack_sp]
     
    75317180  end
    75327181
    7533   #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
    7534   # mikan namesppace 対応 (cell_name)
     7182  #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
     7183  # mikan namesppace 対応 (cell_name)
    75357184  def add_cell_port_through_plugin( cell_name, port_name, subscript, through_plugin_object )
    75367185    if subscript then
     
    75537202  end
    75547203
    7555   #=== Region# to_region への距離(unreachable な場合 nil)
    7556   # mikan Cell#check_region とRegion へたどり着くまでための処理にå
    7557 ±é€šæ€§ãŒé«˜ã„
    7558   # region#distance は require で用いられる
     7204  #=== Region# to_region への距離(unreachable な場合 nil)
     7205  # mikan Cell#check_region とRegion へたどり着くまでための処理に共通性が高い
     7206  # region#distance は require で用いられる
    75597207  def distance( to_region )
    75607208
    7561     r1 = self                   # 出発 region
    7562     r2 = to_region              # 目的 region
     7209    r1 = self                   # 出発 region
     7210    r2 = to_region              # 目的 region
    75637211    dist = 0
    75647212
    7565     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    7566 
    7567       # mikan namespace 対応
     7213    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     7214
     7215      # mikan namespace 対応
    75687216      f1 = r1.get_family_line
    75697217      len1 = f1.length
     
    75717219      len2 = f2.length
    75727220
    7573       # 不一致になるところ(å
    7574 „弟)を探す
    7575       i = 1  # i = 0 は :RootRegion なのでå¿
    7576 ãšä¸€è‡´
     7221      # 不一致になるところ(兄弟)を探す
     7222      i = 1  # i = 0 は :RootRegion なので必ず一致
    75777223      while( i < len1 && i < len2 )
    75787224        if( f1[i] != f2[i] )then
     
    75827228      end
    75837229
    7584       sibling_level = i     # å
    7585 „弟となるレベル、もしくはどちらか一方が終わったレベル
     7230      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    75867231
    75877232      # p "sibling_level: #{i}"
     
    75897234      # p "to: #{f2[i].get_name}" if f2[i]
    75907235
    7591       # 呼び側について呼びå
    7592 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    7593 „弟レベルまで(out_through をチェックおよび挿å
    7594 ¥ï¼‰
     7236      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    75957237      i = len1 -1
    75967238      while i >= sibling_level
     
    76157257      end
    76167258
    7617       # å
    7618 „弟レベルにおいて(to_through をチェックおよび挿å
    7619 ¥ï¼‰
     7259      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    76207260      if f1[sibling_level] && f2[sibling_level] then
    76217261        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
     
    76327272          found = 0
    76337273          f1[sibling_level].get_to_through_list.each { |t|
    7634             if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     7274            if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    76357275              found = 1
    76367276            end
     
    76437283      end
    76447284
    7645       # 受け側についてå
    7646 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    7647 ¥ï¼‰
     7285      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    76487286      i = sibling_level
    76497287      while i < len2
     
    77567394class Import_C < Node
    77577395
    7758   # ヘッダの名前文字列のリスト
     7396  # ヘッダの名前文字列のリスト
    77597397  @@header_list = {}
    77607398  @@header_list2 = []
     
    77637401  include Importable
    77647402
    7765   #=== Import_C# import_C の生成(ヘッダファイルを取込む)
    7766   #header:: Token : import_C の第一引数文字列リテラルトークン
    7767   #define:: Token : import_C の第二引数文字列リテラルトークン
     7403  #=== Import_C# import_C の生成(ヘッダファイルを取込む)
     7404  #header:: Token : import_C の第一引数文字列リテラルトークン
     7405  #define:: Token : import_C の第二引数文字列リテラルトークン
    77687406  def initialize( header, define = nil )
    77697407    super()
    7770     # ヘッダファイル名文字列から前後の "" を取り除く
     7408    # ヘッダファイル名文字列から前後の "" を取り除く
    77717409    # header = header.to_s.gsub( /\A"(.*)"\z/, '\1' )
    77727410    header = CDLString.remove_dquote header.to_s
    77737411
    77747412    if define then
    7775       # 前後の "" を取り除く
     7413      # 前後の "" を取り除く
    77767414      # def_opt = define.to_s.gsub( /\A"(.*)/, '\1' )
    77777415      # def_opt.sub!( /(.*)"\z/, '\1' )
    77787416      def_opt = CDLString.remove_dquote define.to_s
    77797417
    7780       # "," を -D に置き換え
     7418      # "," を -D に置き換え
    77817419      def_opt = def_opt.gsub( /,/, " -D " )
    77827420
    7783       # å
    7784 ˆé ­ã« -D を挿å
    7785 ¥ # mikan 不適切な define å
    7786 ¥åŠ›ãŒã‚った場合、CPP 時にエラー
     7421      # 先頭に -D を挿入 # mikan 不適切な define 入力があった場合、CPP 時にエラー
    77877422      def_opt = def_opt.gsub( /^/, "-D " )
    77887423
    77897424    end
    77907425
    7791     # コマンドライン指定された DEFINE
     7426    # コマンドライン指定された DEFINE
    77927427    $define.each{ |define|
    77937428      if $IN_EXERB then
     
    78137448      if found == false then
    78147449        begin
    7815           # ファイルの stat を取ってみる(なければ例外発生)
     7450          # ファイルの stat を取ってみる(なければ例外発生)
    78167451          File.stat( "#{path}/#{header}" )
    78177452
    7818           # cdl を見つかったファイルパスに再設定
     7453          # cdl を見つかったファイルパスに再設定
    78197454          header_path = "#{path}/#{header}"
    78207455          found = true
     
    78437478    }
    78447479
    7845     # 読込み済み?
     7480    # 読込み済み?
    78467481    if( @@header_list[ header ] ) then
    7847       # 第二引数 define が以前と異なる
     7482      # 第二引数 define が以前と異なる
    78487483      if @@define_list[ header ].to_s != define.to_s then
    78497484        cdl_error( "S1143 import_C: arg2: mismatch with previous one"  )
    78507485      end
    7851       # いずれにせよ読み込まない
     7486      # いずれにせよ読み込まない
    78527487      return
    78537488    end
    78547489
    7855     # ヘッダのリストを記録
     7490    # ヘッダのリストを記録
    78567491    @@header_list[ header ] = header_path
    78577492    @@header_list2 << header
     
    78817516    end
    78827517
    7883     # CPP 出力用 tmp ファイル名
     7518    # CPP 出力用 tmp ファイル名
    78847519    tmp_header = header.gsub( /\//, "_" )
    78857520    tmp_header = "#{$gen}/tmp_#{tmp_header}"
    78867521
    7887     # CPP コマンドラインを作成
     7522    # CPP コマンドラインを作成
    78887523    cmd = "#{$cpp} #{def_opt} #{include_opt} #{tmp_C}"
    78897524
     
    78937528      end
    78947529
    7895       # プリプロセッサコマンドを pipe として開く
    7896           # cmd は cygwin/Linux では bash(sh) 経由で実行される
    7897           # Exerb 版では cmd.exe 経由で実行される
    7898           # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
     7530      # プリプロセッサコマンドを pipe として開く
     7531          # cmd は cygwin/Linux では bash(sh) 経由で実行される
     7532          # Exerb 版では cmd.exe 経由で実行される
     7533          # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
    78997534          cpp = IO.popen( cmd, "r:ASCII-8BIT" )
    79007535      begin
     
    79097544        print_exception( evar )
    79107545      ensure
    7911         tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
     7546        tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
    79127547        cpp.close
    79137548      end
     
    79177552    end
    79187553
    7919     # C 言語のパーサインスタンスを生成
     7554    # C 言語のパーサインスタンスを生成
    79207555    c_parser = C_parser.new
    79217556
    7922     # tmp_header をパース
     7557    # tmp_header をパース
    79237558    c_parser.parse( [tmp_header] )
    79247559
    7925     # 終期化 パーサスタックを戻す
     7560    # 終期化 パーサスタックを戻す
    79267561    c_parser.finalize
    79277562
     
    79847619
    79857620class Import < Node
    7986 # @b_reuse::bool:       å†åˆ©ç”¨ï¼Žã‚»ãƒ«ã‚¿ã‚¤ãƒ—の template 生成不要
    7987 # @b_reuse_real::bool:  実際に再利用
    7988 # @cdl::      string:   import する CDL
    7989 # @cdl_path:: string:   CDL のパス
    7990 # @b_imported:: bool:   import された(コマンドライン指定されていない)
     7621# @b_reuse::bool:       再利用.セルタイプの template 生成不要
     7622# @b_reuse_real::bool:  実際に再利用
     7623# @cdl::      string:   import する CDL
     7624# @cdl_path:: string:   CDL のパス
     7625# @b_imported:: bool:   import された(コマンドライン指定されていない)
    79917626
    79927627  include Importable
    79937628
    7994   # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
     7629  # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
    79957630  @@import_list = {}
    79967631
     
    80137648  end
    80147649
    8015   #=== Import# import を行う
    8016   #cdl::      string   cdl へのパス."" で囲まれていることを仮定
    8017   #b_reuse::  bool     true: template を生成しない
     7650  #=== Import# import を行う
     7651  #cdl::      string   cdl へのパス."" で囲まれていることを仮定
     7652  #b_reuse::  bool     true: template を生成しない
    80187653  def initialize( cdl, b_reuse = false, b_imported = true )
    80197654    Import.push self
     
    80217656    super()
    80227657    @@current_import = self
    8023     # ヘッダファイル名文字列から前後の "", <> を取り除くn
     7658    # ヘッダファイル名文字列から前後の "", <> を取り除くn
    80247659    @cdl = cdl.to_s.gsub( /\A["<](.*)[">]\z/, '\1' )
    80257660
    8026     # サーチパスから探す
     7661    # サーチパスから探す
    80277662    found = false
    80287663    @cdl_path = ""
     
    80477682    end
    80487683
    8049     # 読込み済みなら、読込まない
     7684    # 読込み済みなら、読込まない
    80507685    prev = @@import_list[ File.expand_path( @cdl_path ) ]
    80517686    if( prev ) then
     
    80567691    end
    80577692
    8058     # import リストを記録
     7693    # import リストを記録
    80597694    @@import_list[ File.expand_path( @cdl_path ) ] = self
    80607695
    8061     # plugin から import されている場合
     7696    # plugin から import されている場合
    80627697    plugin = Generator.get_plugin
    80637698
    8064     # パーサインスタンスを生成(別パーサで読み込む)
     7699    # パーサインスタンスを生成(別パーサで読み込む)
    80657700    parser = Generator.new
    80667701
    8067     # plugin から import されている場合の plugin 設定
     7702    # plugin から import されている場合の plugin 設定
    80687703    parser.set_plugin plugin
    80697704
    8070     # reuse フラグを設定
     7705    # reuse フラグを設定
    80717706    parser.set_reuse @b_reuse_real
    80727707
    8073     # cdl をパース
     7708    # cdl をパース
    80747709    parser.parse( [@cdl_path] )
    80757710
    8076     # 終期化 パーサスタックを戻す
     7711    # 終期化 パーサスタックを戻す
    80777712    parser.finalize
    80787713    Import.pop
     
    80997734  end
    81007735
    8101   #=== cdl の名前を返す
    8102   # 引数で指定されている cdl 名。一部パスを含む可能性がある
     7736  #=== cdl の名前を返す
     7737  # 引数で指定されている cdl 名。一部パスを含む可能性がある
    81037738  def get_cdl_name
    81047739    @cdl
     
    81067741end
    81077742
    8108 #== generate: signature, celltype, cell へのプラグインのロードと適用
     7743#== generate: signature, celltype, cell へのプラグインのロードと適用
    81097744class Generate < Node
    81107745#@plugin_name:: Symbol
    81117746#@object_nsp:: NamespacePath
    8112 #@option::         String '"', '"' で囲まれている
     7747#@option::         String '"', '"' で囲まれている
    81137748#@plugin_object:: Plugin
    81147749
     
    81197754    @plugin_name = plugin_name
    81207755    @object_nsp = object_nsp
    8121     option = option.to_s    # option は Token
     7756    option = option.to_s    # option Token
    81227757    @option = option
    81237758    @plugin_object = nil
     
    81327767      @plugin_object = object.apply_plugin( @plugin_name, @option )
    81337768    elsif object then
    8134       # V1.5.0 以前の仕様では、signature のみ可能だった
     7769      # V1.5.0 以前の仕様では、signature のみ可能だった
    81357770#      cdl_error( "S1149 $1 not signature" , signature_nsp )
    81367771      cdl_error( "S9999 generate: '$1' neither signature, celltype nor cell", object_nsp )
     
    81427777end
    81437778
    8144 #== 名前空間パス
     7779#== 名前空間パス
    81457780class NamespacePath < Node
    81467781#@b_absolute::Bool
    81477782#@path::[ Symbol,... ]
    8148 #@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
     7783#@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
    81497784
    81507785  #=== NamespacePath# initialize
    8151   #ident::Symbol           æœ€åˆã®åå‰, ただし "::" のみの場合は String
    8152   #b_absolute:Bool         "::" で始まっている場合 true
    8153   #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、å¿
    8154 ãšæŒ‡å®šã™ã‚‹ã“と
     7786  #ident::Symbol           最初の名前, ただし "::" のみの場合は String
     7787  #b_absolute:Bool         "::" で始まっている場合 true
     7788  #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、必ず指定すること
    81557789  def initialize( ident, b_absolute, namespace = nil )
    81567790    super()
     
    81787812  end
    81797813
    8180   #=== NamespacePath# append する
     7814  #=== NamespacePath# append する
    81817815  #RETURN self
    8182   # このメソッドは、å
    8183 ƒã® NamespacePath オブジェクトを変形して返す
     7816  # このメソッドは、元の NamespacePath オブジェクトを変形して返す
    81847817  def append!( ident )
    81857818    @path << ident
    81867819    return self
    81877820  end
    8188   #=== NamespacePath# append する
    8189   # このメソッドは、å
    8190 ƒã® NamespacePath オブジェクトを変形しない
    8191   #RETURN:: 複製した NamespacePath
     7821  #=== NamespacePath# append する
     7822  # このメソッドは、元の NamespacePath オブジェクトを変形しない
     7823  #RETURN:: 複製した NamespacePath
    81927824  def append( ident )
    81937825    cl = self.clone
     
    82057837  end
    82067838
    8207   #=== NamespacePath#クローンを作成して名前を変更する
     7839  #=== NamespacePath#クローンを作成して名前を変更する
    82087840  def change_name name
    82097841    cl = self.clone
     
    82147846  alias :change_name_clone :change_name
    82157847
    8216   #=== NamespacePath#名前を変更する
    8217   # このインスタンスを参ç
    8218 §ã™ã‚‹ã™ã¹ã¦ã«å½±éŸ¿ã‚’与えることに注意
     7848  #=== NamespacePath#名前を変更する
     7849  # このインスタンスを参照するすべてに影響を与えることに注意
    82197850  def change_name_no_clone name
    82207851    @path[ @path.length - 1 ] = name
     
    82227853  end
    82237854
    8224   #=== NamespacePath:: path 文字列を得る
    8225   # CDL 用の path 文字列を生成
     7855  #=== NamespacePath:: path 文字列を得る
     7856  # CDL 用の path 文字列を生成
    82267857  def to_s
    82277858    get_path_str
     
    82527883  end
    82537884
    8254   #=== NamespacePath:: パスのé
    8255 åˆ—を返す
    8256   # is_absolute? true の場合、ルートからのパス
    8257   #              false の場合、base_namespace からの相対
    8258   # ルート namespace の場合、長さ0のé
    8259 åˆ—を返す
     7885  #=== NamespacePath:: パスの配列を返す
     7886  # is_absolute? true の場合、ルートからのパス
     7887  #              false の場合、base_namespace からの相対
     7888  # ルート namespace の場合、長さ0の配列を返す
    82607889  #
    82617890  def get_path
     
    82637892  end
    82647893
    8265   #=== NamespacePath#フルパスのé
    8266 åˆ—を返す
    8267   # 返されたé
    8268 åˆ—を書き換えてはならない
     7894  #=== NamespacePath#フルパスの配列を返す
     7895  # 返された配列を書き換えてはならない
    82697896  def get_full_path
    82707897    if @b_absolute then
     
    82757902  end
    82767903
    8277   #=== NamespacePath:: 相対パスのベースとなる namespace
    8278   # is_absolute? == false の時のみ有効な値を返す (true なら nil)
     7904  #=== NamespacePath:: 相対パスのベースとなる namespace
     7905  # is_absolute? == false の時のみ有効な値を返す (true なら nil)
    82797906  def get_base_namespace
    82807907    @namespace
    82817908  end
    82827909
    8283   #=== NamespacePath:: C 言語グローバル名を得る
     7910  #=== NamespacePath:: C 言語グローバル名を得る
    82847911  def get_global_name
    82857912    if @b_absolute then
     
    82997926  end
    83007927
    8301   #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
    8302   #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
    8303   #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
     7928  #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
     7929  #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
     7930  #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
    83047931  #
    8305   # NamespacePath は通常構文解析されて作成される
    8306   # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
    8307   # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
     7932  # NamespacePath は通常構文解析されて作成される
     7933  # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
     7934  # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
    83087935  def self.analyze( path_str, b_force_absolute = false )
    83097936
     
    83447971end
    83457972
    8346 # 以下単体テストコード
     7973# 以下単体テストコード
    83477974if $unit_test then
    83487975  root_namespace = Namespace.new("::")
Note: See TracChangeset for help on using the changeset viewer.