Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

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

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2016 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
    52 #   $Id: componentobj.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    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 ‹)
     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: 空(関数が一つもない状態)
    10181
    10282  @@nest_stack_index = -1
     
    11999
    120100  # STAGE: P
    121   # このメソッドは parse 中のみ呼び出される
     101  # このメソッドは parse 中のみ呼び出される
    122102  def self.get_current
    123103    @@current_object
     
    130110    @name = name
    131111    Namespace.new_signature( self )
    132     set_namespace_path # @NamespacePath の設定
     112    set_namespace_path # @NamespacePath の設定
    133113    if "#{Namespace.get_global_name}" == "" then
    134114      @global_name = @name
     
    152132    @function_head_list = function_head_list
    153133
    154     # id を割付ける
     134    # id を割付ける
    155135    id = 1
    156136    function_head_list.get_items.each{ |f|
     
    166146  end
    167147
    168   #=== Signature# signature の指定子を設定
     148  #=== Signature# signature の指定子を設定
    169149  # STAGE: B
    170150  #spec_list::      [ [ :CONTEXT,  String ], ... ]
    171151  #                     s[0]        s[1]
    172152  def set_specifier_list( spec_list )
    173     return if spec_list == nil  # 空ならば何もしない
     153    return if spec_list == nil  # 空ならば何もしない
    174154
    175155    spec_list.each { |s|
     
    216196  end
    217197
    218   #=== Signature# 関数名から signature å†
    219 ã® id を得る
     198  #=== Signature# 関数名から signature 内の id を得る
    220199  def get_id_from_func_name func_name
    221200    @func_name_to_id[ func_name ]
    222201  end
    223202
    224   #=== Signature# context を得る
    225   # context 文字列を返す "task", "non-task", "any"
    226   # 未指定時のデフォルトとして task を返す
     203  #=== Signature# context を得る
     204  # context 文字列を返す "task", "non-task", "any"
     205  # 未指定時のデフォルトとして task を返す
    227206  def get_context
    228207    if @context then
     
    233212  end
    234213
    235   #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
    236   #block:: ブロックを引数に取る
    237   # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
    238   # Port クラスにも each_param がある(同じ働き)
    239   def each_param # ブロック引数 { |func_decl, param_decl| }
    240     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    241 åˆ—
    242     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    243 
    244     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    245 ¥
    246     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    247 åˆ—中の各関数頭部
    248       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    249       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    250         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     214  #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
     215  #block:: ブロックを引数に取る
     216  # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
     217  # Port クラスにも each_param がある(同じ働き)
     218  def each_param # ブロック引数 { |func_decl, param_decl| }
     219    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     220    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     221
     222    pr = Proc.new   # このメソッドのブロック引数を pr に代入
     223    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     224      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     225      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     226        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    251227          pr.call( fd, par )
    252228        }
     
    255231  end
    256232
    257   #=== Signature# 正当なアロケータ シグニチャかテストする
    258   # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
     233  #=== Signature# 正当なアロケータ シグニチャかテストする
     234  # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
    259235  def is_allocator?
    260236
    261     # 一回だけチェックする
     237    # 一回だけチェックする
    262238    if @b_checked_as_allocator_signature == true then
    263239      return true
     
    265241    @b_checked_as_allocator_signature = true
    266242
    267     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    268 åˆ—
    269     if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
     243    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     244    if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
    270245      return false
    271246    end
    272247
    273248    found_alloc = false; found_dealloc = false
    274     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    275 åˆ—中の各関数頭部
    276       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    277       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     249    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     250      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     251      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    278252        func_name = fd.get_name.to_sym
    279253        if func_name == :alloc then
     
    284258                ! params[0].get_type.get_original_type.kind_of?( IntType ) ||
    285259                params[0].get_direction != :IN then
    286               # 第一引数が int 型でない
     260              # 第一引数が int 型でない
    287261              if ! params[0].instance_of?( ParamDecl ) ||
    288262                  ! params[0].get_type.kind_of?( PtrType ) ||
     
    290264                  params[0].get_type.get_type.get_type.kind_of?( PtrType ) ||
    291265                  params[0].get_direction != :OUT then
    292                 # 第一引数がポインタ型でもない
     266                # 第一引数がポインタ型でもない
    293267                cdl_error3( @locale, "S1003 $1: \'alloc\' 1st parameter neither [in] integer type nor [out] double pointer type", @name )
    294268              end
     
    298272                params[1].get_type.get_type.get_type.kind_of?( PtrType ) ||
    299273                params[0].get_direction != :IN then
    300               # (第一引数が整数で) 第二引数がポインタでない
     274              # (第一引数が整数で) 第二引数がポインタでない
    301275              cdl_error3( @locale, "S1004 $1: \'alloc\' 2nd parameter not [in] double pointer" , @name )
    302276            end
     
    313287                params[0].get_direction != :IN then
    314288              cdl_error3( @locale, "S1006 $1: \'dealloc\' 1st parameter not [in] pointer type" , @name )
    315 #            elsif params[1] != nil then    # 第二引き数はチェックしない
     289#            elsif params[1] != nil then    # 第二引き数はチェックしない
    316290#              cdl_error3( @locale, "S1007 Error message is changed to empty" )
    317291#                 cdl_error3( @locale, "S1007 $1: \'dealloc\' cannot has 2nd parameter" , @name )
     
    335309  end
    336310
    337   #== Signature# 引数で参ç
    338 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを作成する
    339   #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参ç
    340 §ã•ã‚Œã¦ã„る場合、最後のものしか返さない
     311  #== Signature# 引数で参照されている Descriptor 型のリストを作成する
     312  #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参照されている場合、最後のものしか返さない
    341313  def get_descriptor_list
    342314    desc_list = { }
    343315    # p "has_desc #{@name}"
    344     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    345 åˆ—
    346     if fha == nil then                                  # nil の場合、自己参ç
    347 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     316    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     317    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    348318      return desc_list
    349319    end
    350320    fha.each{ |fh|
    351       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    352       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     321      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     322      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    353323        params = fd.get_type.get_paramlist.get_items
    354324        if params then
     
    369339  end
    370340
    371   #=== Signature# 引数に Descriptor があるか?
     341  #=== Signature# 引数に Descriptor があるか?
    372342  def has_descriptor?
    373343    # p "has_desc #{@name}"
    374     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    375 åˆ—
    376     if fha == nil then                                  # nil の場合、自己参ç
    377 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     344    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     345    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    378346      return true
    379347    end
    380348    fha.each{ |fh|
    381       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    382       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     349      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     350      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    383351        params = fd.get_type.get_paramlist.get_items
    384352        if params then
     
    399367  end
    400368
    401   #=== Signature# コールバックか?
    402   # 指定子 callback が指定されていれば true
     369  #=== Signature# コールバックか?
     370  # 指定子 callback が指定されていれば true
    403371  def is_callback?
    404372    @b_callback
    405373  end
    406374
    407   #=== Signature# 逸脱か?
    408   # 指定子 deviate が指定されていれば true
     375  #=== Signature# 逸脱か?
     376  # 指定子 deviate が指定されていれば true
    409377  def is_deviate?
    410378    @b_deviate
    411379  end
    412380
    413   #=== Signature# 空か?
     381  #=== Signature# 空か?
    414382  def is_empty?
    415383    @b_empty
    416384  end
    417385
    418   #=== Signature# Push Pop Allocator がå¿
    419 è¦ã‹ï¼Ÿ
    420   # Transparent RPC の場合 oneway かつ in のé
    421 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     386  #=== Signature# Push Pop Allocator が必要か?
     387  # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある
    422388  def need_PPAllocator?( b_opaque = false )
    423     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    424 åˆ—
     389    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
    425390    fha.each{ |fh|
    426391      fd = fh.get_declarator
     
    457422# @factory_list::   Factory[]
    458423# @ct_factory_list::    Factory[] :    celltype factory
    459 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
     424# @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
    460425# @singleton:: bool
    461426# @idx_is_id:: bool
    462427# @idx_is_id_act:: bool: actual value
    463428# @active:: bool
    464 # @b_reuse:: bool :  reuse 指定されて import された(template 不要)
    465 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     429# @b_reuse:: bool :  reuse 指定されて import された(template 不要)
     430# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    466431#
    467432# @n_attribute_ro:: int >= 0    none specified
     
    470435# @n_var:: int >= 0
    471436# @n_var_size_is:: int >= 0     # of [size_is] specified vars # mikan count_is
    472 # @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
     437# @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
    473438# @n_var_init:: int >= 0        # of vars with initializer
    474439# @n_call_port:: int >= 0
    475440# @n_call_port_array:: int >= 0
    476 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     441# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    477442# @n_entry_port:: int >= 0
    478443# @n_entry_port_array:: int >= 0
    479444# @n_entry_port_inline:: int >= 0
    480 # @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参ç
    481 §ä¸å¯
    482 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     445# @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参照不可
     446# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    483447#
    484 # @b_cp_optimized:: bool : 呼び口最適化実施
    485 # @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
    486 #                              generate の指定は @generate にプラグインが保持される
     448# @b_cp_optimized:: bool : 呼び口最適化実施
     449# @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
     450#                              generate の指定は @generate にプラグインが保持される
    487451#
    488 # @included_header:: Hash :  include されたヘッダファイル
    489 # @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region のé
    490 åˆ— (optimize.rb で設定)
    491 #                                               ãƒ«ãƒ¼ãƒˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒã€€nil
     452# @included_header:: Hash :  include されたヘッダファイル
     453# @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region の配列 (optimize.rb で設定)
     454#                                               ルートリージョンはドメイン名が nil
    492455
    493456  include PluginModule
     
    553516
    554517    @plugin = Generator.get_plugin
    555       # plugin の場合 PluginObject が返される
    556     # å
    557 ƒã® Generator から呼出された Generator の中でパースおよび意味チェックされている
     518      # plugin の場合 PluginObject が返される
     519    # 元の Generator から呼出された Generator の中でパースおよび意味チェックされている
    558520
    559521    # if @plugin then
    560     #  # plugin 生成されるセルタイプは再利用ではない   #833 不å
    561 ·åˆä¿®æ­£
     522    #  # plugin 生成されるセルタイプは再利用ではない   #833 不具合修正
    562523    #  @b_reuse = false
    563524    # else
     
    573534
    574535    Namespace.new_celltype( self )
    575     set_namespace_path # @NamespacePath の設定
     536    set_namespace_path # @NamespacePath の設定
    576537    set_specifier_list( Generator.get_statement_specifier )
    577538
     
    589550  end
    590551
    591   #== Celltype#ドメインルートを返す
    592   # @domain_roots の説明を参ç
    593 §
     552  #== Celltype#ドメインルートを返す
     553  # @domain_roots の説明を参照
    594554  def get_domain_roots
    595555    @domain_roots
     
    598558  # Celltype# end_of_parse
    599559  def end_of_parse
    600     # 属性・変数のチェック
     560    # 属性・変数のチェック
    601561    check_attribute
    602562
    603     # アロケータ呼び口をå†
    604 éƒ¨ç”Ÿæˆ
     563    # アロケータ呼び口を内部生成
    605564    generate_allocator_port
    606565
    607     # リレーアロケータ、å†
    608 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     566    # リレーアロケータ、内部アロケータの設定
    609567    @port.each { |p|
    610568      p.set_allocator_instance
     
    666624      end
    667625      if a.get_initializer then
    668         # 登録後にチェックしても問題ない(attr を参ç
    669 §ã§ããªã„ので、自己参ç
    670 §ã—ない)
     626        # 登録後にチェックしても問題ない(attr を参照できないので、自己参照しない)
    671627        a.get_type.check_init( @locale, a.get_identifier, a.get_initializer, :ATTRIBUTE )
    672628      end
     
    674630  end
    675631
    676   #=== Celltype# celltype の attribute/var のチェック
     632  #=== Celltype# celltype の attribute/var のチェック
    677633  # STAGE:  S
    678634  #
    679   # このメソッドは celltype のパースが完了した時点で呼出される.
     635  # このメソッドは celltype のパースが完了した時点で呼出される.
    680636  def check_attribute
    681     # attribute の size_is 指定が妥当かチェック
     637    # attribute の size_is 指定が妥当かチェック
    682638    (@attribute+@var).each{ |a|
    683639      if a.get_size_is then
    684640        if ! a.get_type.kind_of?( PtrType ) then
    685           # size_is がポインタ型以外に指定された
     641          # size_is がポインタ型以外に指定された
    686642          cdl_error( "S1011 $1: size_is specified for non-pointer type" , a.get_identifier )
    687643        else
    688644
    689           # 参ç
    690 §ã™ã‚‹å¤‰æ•°ãŒå­˜åœ¨ã—、計算可能な型かチェックする
    691           size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
     645          # 参照する変数が存在し、計算可能な型かチェックする
     646          size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
    692647          init = a.get_initializer
    693648          if init then
    694649            if ! init.instance_of?( Array ) then
    695               # 初期化子がé
    696 åˆ—ではない
     650              # 初期化子が配列ではない
    697651              cdl_error( "S1012 $1: unsuitable initializer, need array initializer" , a.get_identifier )
    698652            elsif size.kind_of?( Integer ) && size < init.length then
    699               # size_is 指定された個数よりも初期化子のé
    700 åˆ—要素が多い
     653              # size_is 指定された個数よりも初期化子の配列要素が多い
    701654              cdl_error( "S1013 $1: too many initializer, $2 for $3" , a.get_identifier, init.length, size )
    702             # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
     655            # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
    703656            end
    704657
     
    710663              ( a.get_initializer.instance_of?( Expression ) &&
    711664                a.get_initializer.eval_const2(@name_list).instance_of?( Array ) ) then
    712             # size_is 指定されていないポインタが Array で初期化されていたら、エラー
     665            # size_is 指定されていないポインタが Array で初期化されていたら、エラー
    713666            cdl_error( "S1159 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    714667          end
     
    722675  end
    723676
    724   #=== Celltype# アロケータ呼び口を生成
    725   #    send, receive 引数のアロケータを呼出すための呼び口を生成
     677  #=== Celltype# アロケータ呼び口を生成
     678  #    send, receive 引数のアロケータを呼出すための呼び口を生成
    726679  def generate_allocator_port
    727680    @port.each { |port|
    728       # ポートのすべてのパラメータを辿る
     681      # ポートのすべてのパラメータを辿る
    729682      port.each_param { |port, fd, par|
    730         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     683        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    731684        when :SEND, :RECEIVE
    732685          if par.get_allocator then
    733             cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    734             #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    735             # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
     686            cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     687            #           ポート名          関数名         パラメータ名
     688            # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
    736689            alloc_sig_path = par.get_allocator.get_namespace_path
    737             array_size = port.get_array_size            # 呼び口または受け口é
    738 åˆ—のサイズ
    739             created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     690            array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     691            created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    740692            created_port.set_allocator_port( port, fd, par )
    741693            if port.is_optional? then
     
    745697              created_port.set_omit
    746698            end
    747             new_port( created_port )                    # セルタイプに新しい呼び口を追加
     699            new_port( created_port )                    # セルタイプに新しい呼び口を追加
    748700          # else
    749701          #  already error "not found or not signature" in class ParamDecl
     
    762714  end
    763715
    764   #=== Celltype# 新しいå†
    765 éƒ¨å¤‰æ•°
     716  #=== Celltype# 新しい内部変数
    766717  #var:: [Decl]
    767718  def new_var( var )
     
    776727      @name_list.add_item( i )
    777728
    778       # size_is 指定されたé
    779 åˆ—? mikan  count_is
     729      # size_is 指定された配列? mikan  count_is
    780730      if i.get_size_is then
    781731        @n_var_size_is += 1
     
    793743  end
    794744
    795   #=== Celltype# celltype の指定子を設定
     745  #=== Celltype# celltype の指定子を設定
    796746  def set_specifier_list( spec_list )
    797747    return if spec_list == nil
     
    822772
    823773  def new_require( ct_or_cell_nsp, ep_name, cp_name )
    824     # Require: set_owner するものがない
     774    # Require: set_owner するものがない
    825775    obj = Namespace.find( ct_or_cell_nsp )    #1
    826776    if obj.instance_of? Celltype then
    827       # Celltype 名で指定
     777      # Celltype 名で指定
    828778      ct = obj
    829779    elsif obj.instance_of? Cell then
    830       # Cell 名で指定
     780      # Cell 名で指定
    831781      ct = obj.get_celltype
    832782    elsif obj == nil then
     
    839789
    840790    if( ! ct.is_singleton? ) then
    841       # シングルトンではない
     791      # シングルトンではない
    842792      cdl_error( "S1018 $1 : not singleton cell" , obj.get_name )
    843793    end
    844794
    845     # 受け口を探す
     795    # 受け口を探す
    846796    obj2 = ct.find( ep_name )
    847797    if( ( ! obj2.instance_of? Port ) || obj2.get_port_type != :ENTRY ) then
     
    854804
    855805    if obj2.get_signature == nil then
    856       # signature が未定義:既にエラー
     806      # signature が未定義:既にエラー
    857807      return
    858808    end
     
    860810    require_call_port_prefix = :_require_call_port
    861811    if cp_name == nil then
    862       # 関数名重複チェック
     812      # 関数名重複チェック
    863813      @require.each{ |req|
    864814        unless req[0].to_s =~ /^#{require_call_port_prefix}/ then
    865           next     # 名前ありの require は関数名重複チェックしない
     815          next     # 名前ありの require は関数名重複チェックしない
    866816        end
    867817        port = req[2]
    868818        if port.get_signature == obj2.get_signature then
    869           # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
     819          # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
    870820          cdl_error( "S1021 $1 : require cannot have same signature with \'$2\'" , obj2.get_name, port.get_name )
    871821          next
    872822        end
    873823        port.get_signature.get_function_head_array.each{ |f|
    874           # mikan ここは、namedList からの検索にならないの?(効率が悪い)
     824          # mikan ここは、namedList からの検索にならないの?(効率が悪い)
    875825          obj2.get_signature.get_function_head_array.each{ |f2|
    876826            if( f.get_name == f2.get_name ) then
     
    888838      b_has_name = true
    889839    end
    890     # require を追加
     840    # require を追加
    891841    @require << [ cp_name, obj, obj2 ]  # [ lhs:cp_name, rhs:Celltype, rhs:Port ]
    892842
    893     # require port を追加 (呼び口として追加する。ただし require をセットしておく)
     843    # require port を追加 (呼び口として追加する。ただし require をセットしておく)
    894844    port = Port.new( cp_name, obj2.get_signature.get_namespace_path, :CALL )
    895845    port.set_require( b_has_name )
     
    913863  end
    914864
    915   #=== Celltype# セルタイププラグイン (generate 指定子)
     865  #=== Celltype# セルタイププラグイン (generate 指定子)
    916866  def celltype_plugin
    917867
     
    927877
    928878    begin
    929       eval( eval_str )     # plugin を生成
     879      eval( eval_str )     # plugin を生成
    930880      plugin_object.set_locale @locale
    931881      @generate[ 2 ] = plugin_object
     
    939889  end
    940890
    941   #=== Celltype# celltype に新しい cell を追加
     891  #=== Celltype# celltype に新しい cell を追加
    942892  #cell:: Cell
    943   # 新しいセルをセルタイプに追加.
    944   # セルの構文解釈の最後でこのメソドを呼出される.
    945   # シングルトンセルが同じ linkunit に複数ないかチェック
     893  # 新しいセルをセルタイプに追加.
     894  # セルの構文解釈の最後でこのメソドを呼出される.
     895  # シングルトンセルが同じ linkunit に複数ないかチェック
    946896  def new_cell( cell )
    947     # Celltype では Cell の set_owner しない
    948     # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
     897    # Celltype では Cell の set_owner しない
     898    # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
    949899    if @singleton  then
    950900      @cell_list.each{ |c|
     
    960910  end
    961911
    962   #=== Celltype# セルタイプは INIB を持つか?
    963   # セルタイプが INIB を持つかどうかを判定する
    964   # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
    965   # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
    966   #   INIB に置かれるものは
    967   #     attribute (omit のものは除く.現仕様では rw のものはない)
    968   #     size_is を伴う var
    969   #     å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     912  #=== Celltype# セルタイプは INIB を持つか?
     913  # セルタイプが INIB を持つかどうかを判定する
     914  # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
     915  # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
     916  #   INIB に置かれるものは
     917  #     attribute (omit のものは除く.現仕様では rw のものはない)
     918  #     size_is を伴う var
     919  #     呼び口(ただし、最適化で不要となるものは除く)
    970920  def has_INIB?
    971921#    print "name=#{@name} @n_attribute_ro=#{@n_attribute_ro}  @n_var_size_is=#{@n_var_size_is} @n_call_port=#{@n_call_port} @n_call_port_omitted_in_CB=#{@n_call_port_omitted_in_CB} @n_entry_port_array_ns=#{@n_entry_port_array_ns}\n"
     
    974924  end
    975925
    976   #=== Celltype# セルタイプは CB を持つか?
    977   # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    978   #   size_is が指定されていない var
    979   #   rw 指定された attribute (現仕様では存在しない)
    980   # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     926  #=== Celltype# セルタイプは CB を持つか?
     927  # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     928  #   size_is が指定されていない var
     929  #   rw 指定された attribute (現仕様では存在しない)
     930  # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    981931  #   attribute
    982932  #   var
    983   #   å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     933  #   呼び口(ただし、最適化で不要となるものは除く)
    984934  def has_CB?
    985935    if $rom then
     
    991941  end
    992942
    993   #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB がå¿
    994 è¦ã‹
     943  #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB が必要か
    995944  def need_CB_initializer?
    996945    @n_var_init > 0 || has_CB?
    997946  end
    998947
    999   #=== Celltype# 逆require の結合を生成する
     948  #=== Celltype# 逆require の結合を生成する
    1000949  def create_reverse_require_join cell
    1001950    @port.each{ |p|
     
    1004953  end
    1005954
    1006   #=== Celltype# singleton セルを得る
    1007   #region:: Region   : singleton を探す Region
    1008   # 距離が最も近いものを返す
    1009   # mikan 本当は region の範囲の singleton を探すå¿
    1010 è¦ãŒã‚ã‚‹
     955  #=== Celltype# singleton セルを得る
     956  #region:: Region   : singleton を探す Region
     957  # 距離が最も近いものを返す
     958  # mikan 本当は region の範囲の singleton を探す必要がある
    1011959  def get_singleton_cell region
    1012960    cell = nil
    1013     dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
    1014     # require: celltype で指定
     961    dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
     962    # require: celltype で指定
    1015963    @cell_list.each{ |c|
    1016       # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
     964      # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
    1017965      d = region.distance( c.get_region )
    1018966      #debug
     
    1033981  end
    1034982
    1035   #=== Celltype# セルタイププラグインを得る
     983  #=== Celltype# セルタイププラグインを得る
    1036984  def get_celltype_plugin
    1037985    if @generate then
     
    10521000  end
    10531001
    1054   #=== Celltype# アクティブではないか
    1055   # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
     1002  #=== Celltype# アクティブではないか
     1003  # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
    10561004  def is_inactive?
    10571005    if @active == false && @factory_list.length == 0 &&
     
    10741022  end
    10751023
    1076   #=== Celltype# コード生成するå¿
    1077 è¦ãŒã‚るか判定
    1078   # セルの個数が 0 ならセルタイプコードは生成不要
     1024  #=== Celltype# コード生成する必要があるか判定
     1025  # セルの個数が 0 ならセルタイプコードは生成不要
    10791026  def need_generate?
    10801027    @n_cell_gen > 0
    10811028  end
    10821029
    1083   #=== Celltype# require 呼び口の結合を行う
     1030  #=== Celltype# require 呼び口の結合を行う
    10841031  # STAGE: S
    1085   # セルタイプの require 呼び口について、結合を行う
    1086   # セルが生成されないかチェックを行う
     1032  # セルタイプの require 呼び口について、結合を行う
     1033  # セルが生成されないかチェックを行う
    10871034  def set_require_join
    10881035    @require.each{ |req|
     
    11001047  end
    11011048
    1102   #=== Celltype# inline 受け口しかないか?
    1103   # 受け口が無い場合、すべての受け口が inline とはしない
     1049  #=== Celltype# inline 受け口しかないか?
     1050  # 受け口が無い場合、すべての受け口が inline とはしない
    11041051  def is_all_entry_inline?
    11051052    @n_entry_port == @n_entry_port_inline && @n_entry_port > 0
     
    11401087# @n_var:: int >= 0
    11411088# @n_var_size_is:: int >= 0     # of [size_is] specified cells # mikan count_is
    1142 # @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
     1089# @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
    11431090# @n_call_port:: int >= 0
    11441091# @n_call_port_array:: int >= 0
    1145 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     1092# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    11461093# @n_entry_port:: int >= 0
    11471094# @n_entry_port_array:: int >= 0
    11481095    (indent+1).times { print "  " }
    11491096    puts "@n_entry_port_inline #{@n_entry_port_inline}"
    1150 # @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参ç
    1151 §ä¸å¯
    1152 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     1097# @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参照不可
     1098# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    11531099
    11541100  end
     
    11561102
    11571103class Cell < NSBDNode # < Nestable
    1158 # @name:: Symbol : composite celltype のå†
    1159 å´ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã¯å¤–のセル
    1160 # @global_name:: Symbol : C で使える名前(namespace を含む)
    1161 # @local_name:: str : cell celltype name { ... } の name
     1104# @name:: Symbol : composite celltype の内側のインスタンスでは外のセル
     1105# @global_name:: Symbol : C で使える名前(namespace を含む)
     1106# @local_name:: str : cell celltype name { ... } の name
    11621107# @celltype:: Celltype | CompositeCelltype
    11631108# @join_list:: NamedList
     
    11661111# @b_prototype:: bool:  prototype specified in current parsing cell. (@b_defined is used to determine whether definition done)
    11671112# @b_duplicate:: bool:  definition duplicate
    1168 # @b_checked::   bool:  set_definition_join が済んでいる場合 true
    1169 # @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
     1113# @b_checked::   bool:  set_definition_join が済んでいる場合 true
     1114# @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
    11701115# @f_ref:: refercenced from others
    1171 # @entry_array_max_subscript:: { @port=>Integer } : 受け口é
    1172 åˆ—のé
    1173 åˆ—添数の最大値(添数無し受け口é
    1174 åˆ—対応)
     1116# @entry_array_max_subscript:: { @port=>Integer } : 受け口配列の配列添数の最大値(添数無し受け口配列対応)
    11751117# @plugin::     Plugin: avialble if cell is generated by plugin generated cdl code.
    1176 # @referenced_port_list:: { Port => Integer } : 受け口の参ç
    1177 §æ•°
    1178 #                                               ã™ã¹ã¦ã®æ„å‘³è§£æž(through, composite展開)が終わった後に設定する
    1179 #                                               é€†require ポートに対して複数の結合がないかチェックする
    1180 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     1118# @referenced_port_list:: { Port => Integer } : 受け口の参照数
     1119#                                               すべての意味解析(through, composite展開)が終わった後に設定する
     1120#                                               逆require ポートに対して複数の結合がないかチェックする
     1121# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    11811122#
    1182 # composite のためインスタンス変数
     1123# composite のためインスタンス変数
    11831124# @in_composite:: bool : true if in composite celltype
    11841125# @compositecelltypejoin_list:: NamedList : item= CompositeCelltypeJoin ( if @in_composite )
    11851126# @f_cloned:: bool : true if cloned (instantiate of composite consist cell)
    1186 # @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
    1187 # @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
    1188 # @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
    1189 #                          @cell_list2 は composite å†
    1190 ã§ã®å‡ºç¾é † 
     1127# @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
     1128# @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
     1129# @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
     1130#                          @cell_list2 は composite 内での出現順 
    11911131#
    1192 # region のためのインスタンス変数
    1193 # @region:: Region (属するregion)
     1132# region のためのインスタンス変数
     1133# @region:: Region (属するregion)
    11941134#
    1195 # allocator のためのインスタンス変数
     1135# allocator のためのインスタンス変数
    11961136# @alloc_list::  [ [ NORMAL_ALLOC, ep_name, func_name, param_name, expr ], ... ]
    1197 #   å—け口側のアロケータへの結合を記憶。以下のメソッドで追加される
    1198 #      set_specifier … cell 定義時にアロケータ指定されている場合
    1199 #      create_relay_allocator_join … リレーアロケータの場合
     1137#   受け口側のアロケータへの結合を記憶。以下のメソッドで追加される
     1138#      set_specifier … cell 定義時にアロケータ指定されている場合
     1139#      create_relay_allocator_join … リレーアロケータの場合
    12001140#
    1201 # ID のためのインスタンス変数(optimize.rb にて設定)
    1202 # @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
    1203 # @id_specified::Integer : 指定された id
     1141# ID のためのインスタンス変数(optimize.rb にて設定)
     1142# @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
     1143# @id_specified::Integer : 指定された id
    12041144# @restrict_list::{ entry_name => { func_name, [ region_name, ... ] } }
    12051145
    12061146=begin
    1207 # Cell クラスは、以下のものを扱う
    1208 # 1)普通のセル
    1209 # 2)composite セルタイプのセル
    1210 # 3)composite セルタイプのå†
    1211 å´ã®ã‚»ãƒ« (@in_composite)   # composite のå†
    1212 å´ã® composite セルタイプのセルもある
     1147# Cell クラスは、以下のものを扱う
     1148# 1)普通のセル
     1149# 2)composite セルタイプのセル
     1150# 3)composite セルタイプの内側のセル (@in_composite)   # composite の内側の composite セルタイプのセルもある
    12131151#
    1214 # 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
    1215 #    expand (composite セルの展開) は CellOfComposite にのみå¿
    1216 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1217 #    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
    1218 #    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
     1152# 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
     1153#    expand (composite セルの展開) は CellOfComposite にのみ必要なメソッドである
     1154#    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
     1155#    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
    12191156#
    1220 # 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
    1221 #    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
    1222 #    clone_for_composite は CellInCompoiste にのみå¿
    1223 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1224 #    ただし、clone 後に Cell, CellOfComposite に変化するå¿
    1225 è¦ãŒã‚るので、clone ではなく new する実è£
    1226 ã«å¤‰æ›´ã™ã‚‹å¿
    1227 è¦ãŒã‚ã‚‹
     1157# 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
     1158#    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
     1159#    clone_for_composite は CellInCompoiste にのみ必要なメソッドである
     1160#    ただし、clone 後に Cell, CellOfComposite に変化する必要があるので、clone ではなく new する実装に変更する必要がある
    12281161#
    12291162=end
     
    12351168  @@current_object = nil
    12361169
    1237   # 定義されたすべてのセル(出現順. namespace に影響されない)
    1238   @@cell_list = []     # composite のå†
    1239 éƒ¨ã®ã‚»ãƒ«ã‚’含まない
    1240   @@cell_list2 = []    # composite のå†
    1241 éƒ¨ã®ã‚»ãƒ«ã‚’含む (å
    1242 ƒã®ã‚»ãƒ«ã‚’含む)
    1243                        # 意味解析後 make_cell_list2 にて設定される
     1170  # 定義されたすべてのセル(出現順. namespace に影響されない)
     1171  @@cell_list = []     # composite の内部のセルを含まない
     1172  @@cell_list2 = []    # composite の内部のセルを含む (元のセルを含む)
     1173                       # 意味解析後 make_cell_list2 にて設定される
    12441174
    12451175  def self.push
     
    12581188
    12591189
    1260   # composite で clone されたもの(子孫まで含む)
    1261   # Join.change_rhs_port にて CompoisteCelltype å†
    1262 ã® Join の結合å
    1263 ˆã‚’変更する際に使用
     1190  # composite で clone されたもの(子孫まで含む)
     1191  # Join.change_rhs_port にて CompoisteCelltype 内の Join の結合先を変更する際に使用
    12641192  @@cloned_cell_list = {}
    1265   ### mikan BUG @@cloned_cell_list は composite の階層ごとに記憶していないため、同じ名前がå†
    1266 éƒ¨ã«ç¾ã‚Œã‚‹ã¨ã€ã†ã¾ãå‹•ä½œã—ない
    1267   # change_rhs_port の実è£
    1268 ã¯ã€ã“んな回りくどいことをするå¿
    1269 è¦ã¯ãªã‹ã£ãŸã€‚右辺に現れるセル名には、composite のセル名を前につなげるだけでよかった
     1193  ### mikan BUG @@cloned_cell_list は composite の階層ごとに記憶していないため、同じ名前が内部に現れると、うまく動作しない
     1194  # change_rhs_port の実装は、こんな回りくどいことをする必要はなかった。右辺に現れるセル名には、composite のセル名を前につなげるだけでよかった
    12701195
    12711196  def initialize( ct_path, in_composite = false )
     
    12731198    @region = Region.get_current
    12741199
    1275     # celltype のplugin/存在をチェック
     1200    # celltype のplugin/存在をチェック
    12761201    object = Namespace.find( ct_path )    #1
    12771202    if object == nil then
    1278       # mikan celltype の名前が不完å
    1279 ¨ "::ct1ct2" になる
     1203      # mikan celltype の名前が不完全 "::ct1ct2" になる
    12801204      cdl_error( "S1027 \'$1\' celltype not found" , ct_path.get_path_str )
    12811205    elsif ! object.instance_of?( Celltype ) && ! object.instance_of?( CompositeCelltype ) then
    1282       # mikan celltype の名前が不完å
    1283 ¨
     1206      # mikan celltype の名前が不完全
    12841207      cdl_error( "S1028 \'$1\' not celltype" , ct_path.get_path_str )
    12851208    else
     
    13291252    end
    13301253
    1331     # この時点ではプロトタイプか、定義か分らないが、自己参ç
    1332 §ã®ãŸã‚ã«ç™»éŒ²
    1333     # set_f_def で再度登録しなおす
    1334     # Celltype への登録は、end_of_parse で行う
     1254    # この時点ではプロトタイプか、定義か分らないが、自己参照のために登録
     1255    # set_f_def で再度登録しなおす
     1256    # Celltype への登録は、end_of_parse で行う
    13351257    if @in_composite then
    13361258      cell_prev = CompositeCelltype.find( name )
     
    13391261      end
    13401262    else
    1341       # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
     1263      # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
    13421264      cell_prev = Namespace.get_current.find( name )
    13431265      if cell_prev == nil then
    13441266        Namespace.new_cell( self )
    1345         set_namespace_path # @NamespacePath の設定
     1267        set_namespace_path # @NamespacePath の設定
    13461268      end
    13471269    end
     
    13501272      if ! cell_prev.instance_of?( Cell ) then
    13511273        cdl_error( "S1029 $1 mismatch with previous one" , name )
    1352         # celltype が一致しているか ?
     1274        # celltype が一致しているか ?
    13531275      elsif get_celltype != cell_prev.get_celltype then
    13541276        cdl_error( "S1030 $1: celltype mismatch with previous one" , name )
    13551277      else
    1356         # region が一致しているか?
     1278        # region が一致しているか?
    13571279        if ! cell_prev.get_region.equal? get_region then
    13581280          cdl_error( "S1031 $1 region \'$2\' mismatch  with previous one \'$3\'" , name, @region.get_name, cell_prev.get_region.get_name )
     
    13601282
    13611283        @@current_object = cell_prev
    1362         # この時点では、まだプロトタイプ宣言か定義か分らない
    1363         # 以前が定義であって、今回も定義の場合、重複エラーである
     1284        # この時点では、まだプロトタイプ宣言か定義か分らない
     1285        # 以前が定義であって、今回も定義の場合、重複エラーである
    13641286      end
    13651287    end
     
    13711293    dbgPrint "Cell new_cell: #{@global_name} #{@in_composite} #{self}\n"
    13721294
    1373     # å†
    1374 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’ @alloc_list に追加
     1295    # 内部アロケータを @alloc_list に追加
    13751296    if @celltype.instance_of? CompositeCelltype then
    13761297      @celltype.get_internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    13771298        nsp = NamespacePath.new( @name, false )
    1378         rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
     1299        rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
    13791300
    13801301        @alloc_list << [:NORMAL_ALLOC,port_name,nil,fd_name,par_name,rhs]
     
    13841305  end
    13851306
    1386   #=== Cell# cell の定義
    1387   # 本体(join)の定義の直前に呼び出される
     1307  #=== Cell# cell の定義
     1308  # 本体(join)の定義の直前に呼び出される
    13881309  def self.new_def
    13891310    @@current_object.new_def
    13901311  end
    13911312
    1392   #=== Cell# cell の定義
    1393   # 本体(join)の定義の直前に呼び出される
    1394   # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
     1313  #=== Cell# cell の定義
     1314  # 本体(join)の定義の直前に呼び出される
     1315  # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
    13951316  def new_def
    13961317    set_specifier_list( Generator.get_statement_specifier )
    13971318
    1398     # prototype 指定子ないか
     1319    # prototype 指定子ないか
    13991320    if ! @b_prototype then
    1400       # 二重定義のチェック
     1321      # 二重定義のチェック
    14011322      if @b_defined == true then
    14021323        cdl_error( "S1032 $1: duplicate cell" , @name )
    14031324        dbgPrint "previous: #{@prev_locale[0]}: line #{@prev_locale[1]} '#{@name}' defined here\n"
    14041325
    1405         # セルの重複定義エラーの処置
    1406         # 前の定義は捨てる
     1326        # セルの重複定義エラーの処置
     1327        # 前の定義は捨てる
    14071328        @join_list = NamedList.new( nil, "in cell '#{@name}'" )
    14081329      end
     
    14171338  end
    14181339
    1419   #===  Cell# 新しい結合をチェック
     1340  #===  Cell# 新しい結合をチェック
    14201341  # STAGE:   P
    14211342  #
    1422   #join::  Join : 新しい結合
    1423   #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
     1343  #join::  Join : 新しい結合
     1344  #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
    14241345  def new_join( join, b_regular = false )
    14251346    join.set_owner self
    14261347
    1427     # composite の新文法対応.
    1428     # composite の中のセルで、attribute の定義である場合
    1429     # cell å†
    1430 ã® attr_ext = composite.attr; 構文を処理
     1348    # composite の新文法対応.
     1349    # composite の中のセルで、attribute の定義である場合
     1350    # cell 内の attr_ext = composite.attr; 構文を処理
    14311351    if @in_composite then
    14321352      if @celltype then
    1433         if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
     1353        if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
    14341354          rhs = join.get_rhs
    14351355          if rhs.instance_of? Expression then
    14361356            ele = rhs.get_elements
    1437             if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単é 
    1438 ï¼‰ã‹ï¼Ÿ #1
    1439               if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
    1440                 ident = ele[1].get_name   # 右辺は attribute.
     1357            if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単項)か? #1
     1358              if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
     1359                ident = ele[1].get_name   # 右辺は attribute.
    14411360              else
    1442                 # 右辺は attribute にないのであれば、定数のはず
    1443                 # 定数は下へ渡す (cell の join にする)
     1361                # 右辺は attribute にないのであれば、定数のはず
     1362                # 定数は下へ渡す (cell の join にする)
    14441363                ident = nil
    14451364              end
    14461365            else
    1447               if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
    1448                 # 右辺が、単一のシンボルでない場合、現状は扱えない
     1366              if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
     1367                # 右辺が、単一のシンボルでない場合、現状は扱えない
    14491368                cdl_error( "S1033 rhs expression is not supported. Only attribute is permitted on current version."  )
    14501369                return
    14511370              else
    1452                 # 定数は下へ渡す (cell の join にする)
     1371                # 定数は下へ渡す (cell の join にする)
    14531372                ident = nil
    14541373              end
     
    14561375
    14571376            if ident then
    1458               # attr = attr; のような参ç
    1459 §ã¯ã‚¨ãƒ©ãƒ¼ (a = composite.a とするå¿
    1460 è¦ãŒã‚ã‚‹)
     1377              # attr = attr; のような参照はエラー (a = composite.a とする必要がある)
    14611378              if @celltype.find( ident ) then
    14621379                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 )
     
    14641381            end
    14651382          elsif rhs.instance_of? Array then
    1466             if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
     1383            if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
    14671384              ident = rhs[1].to_sym
    14681385            else
    1469               ident = nil    # 右辺は { 10, -10 } の形式
     1386              ident = nil    # 右辺は { 10, -10 } の形式
    14701387            end
    14711388          else
    1472             ident = nil      # 右辺は C_EXP の形式
     1389            ident = nil      # 右辺は C_EXP の形式
    14731390          end
    14741391
    1475           # ident が見つかった(右辺は単一の ident)
     1392          # ident が見つかった(右辺は単一の ident)
    14761393          if ident then
    1477             # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
     1394            # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
    14781395            #                        export_name, internal_cell_name, internal_cell_elem_name
    1479             decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
     1396            decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
    14801397            if ! decl.instance_of? Decl then
    14811398              return
     
    14851402              return
    14861403            end
    1487             # 以下の旧文法実è£
    1488 ã«æ¸¡ã™ï¼Ž
    1489             # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
    1490             # attribute で指定された初期値を cell の属性として処理させる
     1404            # 以下の旧文法実装に渡す.
     1405            # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
     1406            # attribute で指定された初期値を cell の属性として処理させる
    14911407            join.change_rhs( ini )
    14921408          else
    1493             # ident がない.定数式
     1409            # ident がない.定数式
    14941410          end
    14951411        else
    1496           # celltype の属性として、この join の名前がない
    1497           # 以下の join.set_definition の中でエラーとなる
     1412          # celltype の属性として、この join の名前がない
     1413          # 以下の join.set_definition の中でエラーとなる
    14981414        end
    14991415      else
    1500         return    # celltype がない.すでにエラー
     1416        return    # celltype がない.すでにエラー
    15011417      end
    15021418    elsif join.get_rhs.instance_of? Array then
    15031419      rhs = join.get_rhs
    15041420      if rhs[0] == :COMPOSITE then
    1505         # composite の中でないのに attr = composite.attr が使われた
     1421        # composite の中でないのに attr = composite.attr が使われた
    15061422        cdl_error( "S1035 composite : cannot specify out of composite celltype definition"  )
    15071423        return
     
    15091425    end
    15101426
    1511     # 以下 composite 文法変更前からある処理
    1512 
    1513     # 既に左辺が同じ名前の初期化が存在するか?
    1514     j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
    1515     if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
     1427    # 以下 composite 文法変更前からある処理
     1428
     1429    # 既に左辺が同じ名前の初期化が存在するか?
     1430    j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
     1431    if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
    15161432
    15171433      # debug
    15181434      dbgPrint "add_array_member: #{@name} port: #{j.get_port_name} rhs: #{j.get_rhs}, #{join.get_port_name} #{join.get_rhs}\n"
    1519       # 呼び口é
    1520 åˆ—(であると仮定して)要素を追加
     1435      # 呼び口配列(であると仮定して)要素を追加
    15211436      j.add_array_member join
    15221437
     
    15261441    end
    15271442
    1528     # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
     1443    # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
    15291444    #   dbgPrint "Cell#new_join: #{get_owner.get_name}.#{@name}\n"
    15301445    # else
     
    15401455  end
    15411456
    1542   #=== Cell.新しい逆結合
     1457  #=== Cell.新しい逆結合
    15431458  def self.new_reverse_join( reverse_join )
    15441459    @@current_object.new_reverse_join( reverse_join )
    15451460  end
    15461461
    1547   #=== Cell#新しい逆結合
     1462  #=== Cell#新しい逆結合
    15481463  def new_reverse_join( reverse_join )
    15491464    dbgPrint( "new_reverse_join name=#{reverse_join.get_name}\n")
     
    15701485  end
    15711486
    1572   #=== Cell#逆結合から結合を生成
     1487  #=== Cell#逆結合から結合を生成
    15731488  # STAGE: S
    15741489  def create_reverse_join
     
    15801495#      @reverse_join_list.get_items.each{ |rj|
    15811496      @reverse_join_list.each{ |rj|
    1582         # 逆結合のæƒ
    1583 å ±ã‚’å¾—ã‚‹
     1497        # 逆結合の情報を得る
    15841498        ep_name = rj.get_name
    15851499        ep_subscript, cp_cell_nsp, cp_name, cp_subscript = rj.get_rhs_cell_and_port
    15861500
    1587         # 呼び口側のセルと、そのセルタイプ
     1501        # 呼び口側のセルと、そのセルタイプ
    15881502        cell = Namespace.find cp_cell_nsp
    15891503        if ! cell.instance_of? Cell then
     
    16161530  end
    16171531
    1618   #=== Cell# cell å†
    1619 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
    1620   # internal_cell_elem_name:: string : 呼び口名
    1621   # export_name:: string: composite の外部にå
    1622 ¬é–‹ã™ã‚‹å‘¼ã³å£å
    1623   #  呼び口を外部結合する.
    1624   #  このメソッドは、composite の中の cell でしか呼ばれない.
     1532  #=== Cell# cell 内に記述する呼び口の外部結合
     1533  # internal_cell_elem_name:: string : 呼び口名
     1534  # export_name:: string: composite の外部に公開する呼び口名
     1535  #  呼び口を外部結合する.
     1536  #  このメソッドは、composite の中の cell でしか呼ばれない.
    16251537  def external_join( internal_cell_elem_name, export_name, b_composite )
    16261538
    1627     # cCall => composite.cCall; ではないか?
     1539    # cCall => composite.cCall; ではないか?
    16281540    if( b_composite == false )then
    1629       # cCall => cCall; のような場合
     1541      # cCall => cCall; のような場合
    16301542      if @celltype.find( export_name ) then
    16311543        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 )
    16321544      end
    16331545    end
    1634     # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
     1546    # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
    16351547    CompositeCelltype.new_join( export_name, @name,  internal_cell_elem_name, :CALL )
    16361548  end
     
    16441556
    16451557  def end_of_parse f_def
    1646     if @b_prototype then  # prototype 指定子あったか?
    1647       f_def = false       # プロトタイプ宣言とする
     1558    if @b_prototype then  # prototype 指定子あったか?
     1559      f_def = false       # プロトタイプ宣言とする
    16481560      @b_prototype = false
    16491561    end
    16501562    if f_def == false then
    1651       # cell tCelltype Cell; の形式の場合
    1652       # f_def == true の場合 new_def で、呼出される
     1563      # cell tCelltype Cell; の形式の場合
     1564      # f_def == true の場合 new_def で、呼出される
    16531565      set_specifier_list( Generator.get_statement_specifier )
    16541566    end
     
    16601572  end
    16611573
    1662   #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
    1663   #    このメソッドは構文解釈の最後に呼出される
     1574  #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
     1575  #    このメソッドは構文解釈の最後に呼出される
    16641576  #f_def::     bool     false if prototype, true if definition
    16651577  def set_f_def f_def
     
    16801592    @f_ref = true
    16811593
    1682     # composite のå†
    1683 éƒ¨ã‚»ãƒ«ã‚’参ç
    1684 §ã•ã‚ŒãŸã“とにする
    1685     # 今のところ問題ないが、未参ç
    1686 §ã§ã‚るべきものまで参ç
    1687 §ã•ã‚ŒãŸã“とになる
     1594    # composite の内部セルを参照されたことにする
     1595    # 今のところ問題ないが、未参照であるべきものまで参照されたことになる
    16881596    if @cell_list then
    16891597      @cell_list.each{ |cn,cell|
     
    16931601  end
    16941602
    1695   #=== Cell# cell の指定子を設定
     1603  #=== Cell# cell の指定子を設定
    16961604  # STAGE:  B
    16971605  #
    1698   #    bnf.y.rb の statement_specifiler_list
     1606  #    bnf.y.rb statement_specifiler_list
    16991607  #spec_list::      [ :ALLOCATOR, [ [ :NORMAL_ALLOC, ep_name, subscript, func_name, param_name, expr ], ... ] ]
    17001608  #                     s[0]      s[1]   a[0]        a[1]       a[2]        a[3]     a[4]       a[5]
    1701   #    セルに指定されたアロケータ指定子
    1702   #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
    1703   #    受け口側に生成されるアロケータ呼び口の結合をå†
    1704 éƒ¨ç”Ÿæˆã™ã‚‹
    1705   #    呼び口側は Port の create_allocator_join にて生成
    1706   #    リレーアロケータの場合 create_relay_allocator_join にて生成す
     1609  #    セルに指定されたアロケータ指定子
     1610  #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
     1611  #    受け口側に生成されるアロケータ呼び口の結合を内部生成する
     1612  #    呼び口側は Port の create_allocator_join にて生成
     1613  #    リレーアロケータの場合 create_relay_allocator_join にて生成す
    17071614  def set_specifier_list( spec_list )
    1708     return if spec_list == nil  # 空ならば何もしない
     1615    return if spec_list == nil  # 空ならば何もしない
    17091616
    17101617    dbgPrint( "set_spec_list: #{@name}\n" )
    1711     b_generate = false   # generate が指定された
     1618    b_generate = false   # generate が指定された
    17121619
    17131620    spec_list.each{ |s|
    17141621      case s[0]             # statement_specifier
    17151622      when :ALLOCATOR       # [allocator(ePort.func.param=allocCell.eA,ePort.func2.param=allocCell.eA)]
    1716         s[1].each { |a|     # alloc_list : allocator のå†
    1717 éƒ¨ã® ',' で区切られた部分のé
    1718 åˆ—
    1719           cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
     1623        s[1].each { |a|     # alloc_list : allocator の内部の ',' で区切られた部分の配列
     1624          cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
    17201625          # p "#{a[0]} #{a[0+1]} #{a[2+1]} #{a[3+1]} #{cp_name}"
    17211626          if a[1+1] then
     
    17251630            subscript = nil
    17261631          end
    1727           # アロケータ呼び口の結合を生成
    1728           join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
     1632          # アロケータ呼び口の結合を生成
     1633          join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
    17291634          dbgPrint( "new allocator join #{cp_name} #{subscript} #{a[4+1]}\n" )
    17301635          Cell.new_join( join )
     
    17721677  def get_allocator_list
    17731678
    1774     # 意味チェック(set_definition)されていない?
    1775     # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
     1679    # 意味チェック(set_definition)されていない?
     1680    # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
    17761681    if @b_checked == false then
    17771682      set_definition_join
     
    17841689  end
    17851690
    1786   #=== id 指定子の値を設定
    1787   # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
    1788   # 通常の id 指定子では使っていない
     1691  #=== id 指定子の値を設定
     1692  # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
     1693  # 通常の id 指定子では使っていない
    17891694  def set_specified_id id
    17901695    if Integer( id ) != id || id <= 0 then
     
    17971702  end
    17981703
    1799   #=== Cell# セルタイププラグイン (generate 指定子)
     1704  #=== Cell# セルタイププラグイン (generate 指定子)
    18001705  def cell_plugin
    18011706
     
    18111716
    18121717    begin
    1813       eval( eval_str )     # plugin を生成
     1718      eval( eval_str )     # plugin を生成
    18141719      plugin_object.set_locale @locale
    18151720      @generate[ 2 ] = plugin_object
     
    18271732  end
    18281733
    1829   #=== Cell# cell を composite セルタイプのセル用に clone する
    1830   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    1831   #global_name:: string : 親 cell の global_name
    1832   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    1833   #ct_name::     string : 親セルのセルタイプ名
    1834   #region::      Region : å
    1835 ƒã®ã‚»ãƒ«ãŒå±žã™ã‚‹ region
    1836   #このメソッドは CompositeCelltype の expand から呼出される
     1734  #=== Cell# cell を composite セルタイプのセル用に clone する
     1735  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     1736  #global_name:: string : 親 cell の global_name
     1737  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     1738  #ct_name::     string : 親セルのセルタイプ名
     1739  #region::      Region : 元のセルが属する region
     1740  #このメソッドは CompositeCelltype の expand から呼出される
    18371741  def clone_for_composite( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    18381742
     
    18431747    @@cloned_cell_list[ self ] = @my_clone
    18441748
    1845     # clone したセルのå†
    1846 éƒ¨ã«æŒã¤åå‰æƒ
    1847 å ±ã‚’調整する
     1749    # clone したセルの内部に持つ名前情報を調整する
    18481750
    18491751    @my_clone.set_cloned( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    18501752
    1851     # @celltype == nil は以前にセルタイプ未定義エラー
     1753    # @celltype == nil は以前にセルタイプ未定義エラー
    18521754    if @b_defined == true && @celltype != nil then
    18531755      if @celltype.instance_of?( Celltype ) then
    1854         # celltype に登録(コード生成の対象となる)
     1756        # celltype に登録(コード生成の対象となる)
    18551757        @celltype.new_cell( @my_clone )
    18561758      end
     
    18601762  end
    18611763
    1862   #=== Cell# clone されたセルのå†
    1863 éƒ¨ã«æŒã¤åå‰æƒ
    1864 å ±ã‚’調整する
    1865   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    1866   #global_name:: string : 親 cell の global_name
    1867   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    1868   #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
    1869   #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
     1764  #=== Cell# clone されたセルの内部に持つ名前情報を調整する
     1765  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     1766  #global_name:: string : 親 cell の global_name
     1767  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     1768  #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
     1769  #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
    18701770  def set_cloned( name, global_name, namespacePath, join_array, parent_ct_name, region, plugin, locale )
    18711771
     
    18841784    @f_cloned = true
    18851785
    1886     # Namespace.new_cell( self )  # mikan namespace 対応
    1887     region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
    1888 
    1889     # join_list : NamedList の clone を作る
     1786    # Namespace.new_cell( self )  # mikan namespace 対応
     1787    region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
     1788
     1789    # join_list : NamedList の clone を作る
    18901790    if @celltype then
    18911791      dbgPrint "set_cloned: #{@celltype.get_name} #{@name} #{region.get_name}\n"
     
    19001800    @cell_list2 = []
    19011801
    1902     # このセルのグローバル名を与える
    1903     # C_EXP の$id$ 置換はこのセルの名前になる
     1802    # このセルのグローバル名を与える
     1803    # C_EXP の$id$ 置換はこのセルの名前になる
    19041804    join_array.each { |j|
    19051805      @join_list.change_item j
    19061806    }
    19071807
    1908     # clone しようとするセルが composit セルタイプ?
     1808    # clone しようとするセルが composit セルタイプ?
    19091809    if @celltype.instance_of?( CompositeCelltype ) then
    1910       # composite cell を再帰的に展開
     1810      # composite cell を再帰的に展開
    19111811      @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    19121812    end
     
    19141814  end
    19151815
    1916   #=== Cell# clone された cell の join_list の右辺の変更
    1917   #  呼び口の右辺の cell を他の clone された cell に置換え
     1816  #=== Cell# clone された cell の join_list の右辺の変更
     1817  #  呼び口の右辺の cell を他の clone された cell に置換え
    19181818  def change_rhs_port
    19191819
     
    19271827    if @celltype.instance_of?( CompositeCelltype ) then
    19281828
    1929       # å
    1930 ¥ã‚Œå­ã®ã‚»ãƒ«ã«ã¤ã„ても変更
     1829      # 入れ子のセルについても変更
    19311830      @cell_list.each{ |name,c|
    19321831        c.change_rhs_port
     
    19671866  end
    19681867
    1969   #=== Cell# 生成されるセルか?
    1970   # 最適化、コード生成中に、対象となる region に属する場合 true を返す
     1868  #=== Cell# 生成されるセルか?
     1869  # 最適化、コード生成中に、対象となる region に属する場合 true を返す
    19711870  def is_generate?
    19721871    if $generating_region == nil then
    1973       # 構文解釈、意味解析段階で呼ばれると例外発生
     1872      # 構文解釈、意味解析段階で呼ばれると例外発生
    19741873      raise "is_generate? called before optimizing"
    19751874    end
     
    19831882  end
    19841883
    1985   #=== Cell# composite å†
    1986 éƒ¨ã®è¤‡è£½ã•ã‚ŒãŸã‚»ãƒ«ã‹ï¼Ÿ
    1987   # composite 定義のå†
    1988 éƒ¨ã®ã‚»ãƒ« (@in_composite = true) ではない
     1884  #=== Cell# composite 内部の複製されたセルか?
     1885  # composite 定義の内部のセル (@in_composite = true) ではない
    19891886  def is_cloned?
    19901887    @f_cloned
    19911888  end
    19921889
    1993   #=== Cell# composite å†
    1994 éƒ¨ã®ã‚»ãƒ«ã‹ï¼Ÿ
     1890  #=== Cell# composite 内部のセルか?
    19951891  def is_in_composite?
    19961892    @in_composite
    19971893  end
    19981894
    1999   # composite cell の port に対応するå†
    2000 éƒ¨ã® cell の port の名前(リンク時にå¿
    2001 è¦ãªåå‰ï¼‰
     1895  # composite cell の port に対応する内部の cell の port の名前(リンク時に必要な名前)
    20021896  def get_real_global_name port_name
    20031897    if @celltype.instance_of?( CompositeCelltype ) then
     
    20271921  end
    20281922
    2029   #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
    2030   #    namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
     1923  #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
     1924  #    namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
    20311925  def get_real_global_port_name port_name
    20321926
    2033     # composite か?
     1927    # composite か?
    20341928    if @celltype.instance_of?( CompositeCelltype ) then
    20351929
     
    20421936      }
    20431937
    2044       # セルタイプå†
    2045 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2046 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1938      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20471939      cj = @celltype.find_export( port_name )
    20481940
     
    20501942      dbgPrint "   composite join name: #{cj.get_name}  cell: #{cj.get_cell_name}  cell elem: #{cj.get_cell_elem_name}\n"
    20511943
    2052       # composite のå†
    2053 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_global_port_name を適用
     1944      # composite の内部のセルに対し再帰的に get_real_global_port_name を適用
    20541945      name = @cell_list[ "#{cj.get_cell_name}" ].get_real_global_port_name( cj.get_cell_elem_name )
    20551946      return name
     
    20631954  end
    20641955
    2065   #=== Cell# PORT (celltype の定義) を得る
     1956  #=== Cell# PORT (celltype の定義) を得る
    20661957  def get_real_port( port_name )
    20671958
    2068     # composite か?
     1959    # composite か?
    20691960    if @celltype.instance_of?( CompositeCelltype ) then
    20701961
    2071       # セルタイプå†
    2072 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2073 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1962      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20741963      cj = @celltype.find_export( port_name )
    20751964
    2076       # composite のå†
    2077 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     1965      # composite の内部のセルに対し再帰的に get_real_port を適用
    20781966      port = @cell_list[ "#{cj.get_cell_name}" ].get_real_port( cj.get_cell_elem_name )
    20791967      return port
     
    20841972  end
    20851973
    2086   #=== Cell# cell を得る
    2087   #    composite でなければ自分自身を返す
     1974  #=== Cell# cell を得る
     1975  #    composite でなければ自分自身を返す
    20881976  def get_real_cell( port_name )
    20891977
    2090     # composite か?
     1978    # composite か?
    20911979    if @celltype.instance_of?( CompositeCelltype ) then
    20921980
    2093       # セルタイプå†
    2094 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2095 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1981      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20961982      cj = @celltype.find_export( port_name )
    20971983
    2098       # composite のå†
    2099 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     1984      # composite の内部のセルに対し再帰的に get_real_port を適用
    21001985      cell = @cell_list[ "#{cj.get_cell_name}" ].get_real_cell( cj.get_cell_elem_name )
    21011986      return cell
     
    21071992
    21081993
    2109   #=== Cell# 受け口のport の参ç
    2110 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
    2111   #port_name:: Symbol  : ポート名
     1994  #=== Cell# 受け口のport の参照カウントをアップする
     1995  #port_name:: Symbol  : ポート名
    21121996  def port_referenced port
    21131997    if @referenced_port_list[ port ] then
     
    21172001    end
    21182002
    2119     # composite か?
     2003    # composite か?
    21202004    if @celltype.instance_of?( CompositeCelltype ) then
    21212005
    2122       # セルタイプå†
    2123 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2124 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2006      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    21252007      cj = @celltype.find_export( port.get_name )
    21262008
    21272009      dbgPrint " port_referenced: #{@celltype.get_name} #{@name} cj=#{cj&&(cj.get_name)||"nil"}\n"
    21282010
    2129       if cj then  # 既にエラー
    2130         # composite のå†
    2131 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2011      if cj then  # 既にエラー
     2012        # composite の内部のセルに対し再帰的に get_real_port を適用
    21322013        cell = @cell_list[ "#{cj.get_cell_name}" ]
    21332014        if cell && cell.get_celltype then
     
    21812062  end
    21822063
    2183   #=== Cell# 受け口é
    2184 åˆ—の添数の最大値を設定
     2064  #=== Cell# 受け口配列の添数の最大値を設定
    21852065  def set_entry_port_max_subscript( port, num )
    21862066    dbgPrint( "set_entry_port_max_subscript: #{@name}.#{port.get_name}: #{num}\n" )
     
    21932073  end
    21942074
    2195   #=== Cell# composite のå†
    2196 å´ã‚»ãƒ«ã®å—け口é
    2197 åˆ—の添数の最大値を設定
     2075  #=== Cell# composite の内側セルの受け口配列の添数の最大値を設定
    21982076  def set_entry_inner_port_max_subscript( port, num )
    2199     if @cell_list == nil then   # mikan これって問題ない?
    2200       return    # プロトタイプ宣言しかされていなくて、å†
    2201 å´ã‚»ãƒ«ãŒå±•é–‹ã•ã‚Œã¦ã„ない
    2202     end
    2203 
    2204     # composite のå†
    2205 å´ã®ã‚»ãƒ«ã«ä¼æ’­
     2077    if @cell_list == nil then   # mikan これって問題ない?
     2078      return    # プロトタイプ宣言しかされていなくて、内側セルが展開されていない
     2079    end
     2080
     2081    # composite の内側のセルに伝播
    22062082    if @celltype.instance_of? CompositeCelltype then
    22072083      cj = @celltype.find_export port.get_name
     
    22172093  end
    22182094
    2219   #=== Cell# 受け口é
    2220 åˆ—の添数の最大値を返す
    2221   # 長さは +1 する
    2222   # 1つもない場合は -1 を返す
     2095  #=== Cell# 受け口配列の添数の最大値を返す
     2096  # 長さは +1 する
     2097  # 1つもない場合は -1 を返す
    22232098  def get_entry_port_max_subscript( port )
    22242099    subscript = @entry_array_max_subscript[port]
     
    22292104  end
    22302105
    2231   #=== Cell# リレーアロケータの結合を生成
     2106  #=== Cell# リレーアロケータの結合を生成
    22322107  # STAGE: S
    2233   # 呼び口側の結合をå
    2234 ƒã«å—け口側の結合を生成
     2108  # 呼び口側の結合を元に受け口側の結合を生成
    22352109  def create_relay_allocator_join
    22362110
    2237     # celltype がなければチェックしない(既にエラー)
     2111    # celltype がなければチェックしない(既にエラー)
    22382112    return if @celltype == nil
    22392113
    2240     # relay allocator を生成
     2114    # relay allocator を生成
    22412115    @celltype.get_port_list.each { |p|
    22422116      ail = p.get_allocator_instance
     
    22442118        dbgPrint "create_relay_allocator_join: #{@name}, #{p.get_name}\n"
    22452119        if p.get_array_size then
    2246           # mikan relay allocator が array に対応できてもよいのでは?
     2120          # mikan relay allocator が array に対応できてもよいのでは?
    22472121          cdl_error( "S1040 array not supported for relay allocator"  )
    22482122          next
     
    22522126          if ai2[0] == :RELAY_ALLOC then
    22532127            dbgPrint "create_relay_allocator_join: #{@name}, #{name}\n"
    2254             # 呼び口側の結合を取り出す
     2128            # 呼び口側の結合を取り出す
    22552129            ja = @join_list.get_item( :"#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    22562130            if ja == nil then
    2257               # 見つからない場合
     2131              # 見つからない場合
    22582132              found = false
    22592133             
    2260               # composite å†
    2261 ã§å¤–部に結合されているか
     2134              # composite 内で外部に結合されているか
    22622135              if @in_composite then
    22632136                @compositecelltypejoin_list.get_items.each { |cj|
     
    22762149                cdl_error( "S1041 \'$1_$2_$3\': not joined. cannot create internal join for relay allocator" , ai2[3], ai2[4], ai2[5] )
    22772150                print( "      In cell #{get_name}\n" )
    2278                 # join が未結合であることのエラーは二度でる (S1043)
     2151                # join が未結合であることのエラーは二度でる (S1043)
    22792152              end
    2280               next    # 打ち切る
     2153              next    # 打ち切る
    22812154            end
    22822155
    22832156            b_export = false
    2284             # composite å†
    2285 ã®ã‚»ãƒ«ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るかチェック
    2286             #  mikan エクスポート側と、こちら側で、リレーå
    2287 ˆãŒä¸€è‡´ã™ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ãŒå¿
    2288 è¦
     2157            # composite 内のセルでエクスポートされているかチェック
     2158            #  mikan エクスポート側と、こちら側で、リレー先が一致するかチェックが必要
    22892159            if @compositecelltypejoin_list then
    2290               # export されているか調べる
     2160              # export されているか調べる
    22912161              @compositecelltypejoin_list.get_items.each{ |cj|
    2292                 # 属性名と composite の export する名前は一致するか
     2162                # 属性名と composite の export する名前は一致するか
    22932163                if p.get_name == cj.get_cell_elem_name then
    22942164                  print "export : #{p.get_name}\n"
    2295                   b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
     2165                  b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
    22962166                  break
    22972167                end
     
    23002170            end
    23012171
    2302             # mikan é
    2303 åˆ—
     2172            # mikan 配列
    23042173            am = nil
    23052174            if am then
     
    23082177                subscript = ja2.get_subscript
    23092178                if b_export == false then
    2310                   # CompositeCelltype の場合、å†
    2311 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2179                  # CompositeCelltype の場合、内側のセルで生成させる
    23122180                  join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs, @loacle )
    23132181                  # p ( "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs )
    23142182                  new_join( join )
    23152183                  join.set_definition( @celltype.find(join.get_name) )
    2316                   # mikan relay mismatch チェックができていない(下方を参ç
    2317 §ï¼‰
     2184                  # mikan relay mismatch チェックができていない(下方を参照)
    23182185                end
    23192186                @alloc_list << [ :NORMAL_ALLOC, p.get_name, subscript, ai2[1], ai2[2], rhs ]
     
    23212188            else
    23222189              if b_export == false then
    2323                 # CompositeCelltype の場合、å†
    2324 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2190                # CompositeCelltype の場合、内側のセルで生成させる
    23252191                join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", nil, ja.get_rhs, @locale )
    23262192                new_join( join )
     
    23322198                                      "#{p.get_name}_#{ai2[1]}_#{ai2[2]}",
    23332199                                      "#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    2334                     # 本当は composite の呼び口と受け口の間で行うべきだが、å†
    2335 éƒ¨ã§å¤šæ®µæŽ¥ç¶šã•ã‚Œã¦ã„る場合
     2200                    # 本当は composite の呼び口と受け口の間で行うべきだが、内部で多段接続されている場合
    23362201                  else
    23372202                    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"
     
    23482213  end
    23492214
    2350   #=== Cell# @@cell_list2 を作る
    2351   # @@cell_list2 は、出現順に composite å†
    2352 ã‚’含むセルのリスト
     2215  #=== Cell# @@cell_list2 を作る
     2216  # @@cell_list2 は、出現順に composite 内を含むセルのリスト
    23532217  def self.make_cell_list2
    23542218    @@cell_list.each{ |c|
     
    23582222  end
    23592223
    2360   #=== Cell# @@cell_list2 を得る
    2361   # composite å†
    2362 ã‚’含む (compositeも含む)
    2363   # 意味解析後に作成される
     2224  #=== Cell# @@cell_list2 を得る
     2225  # composite 内を含む (compositeも含む)
     2226  # 意味解析後に作成される
    23642227  def self.get_cell_list2
    23652228    @@cell_list2
    23662229  end
    23672230
    2368   #=== Cell# @@cell_list を得る
    2369   #composite の中を含まない
     2231  #=== Cell# @@cell_list を得る
     2232  #composite の中を含まない
    23702233  def self.get_cell_list
    23712234    @@cell_list
    23722235  end
    23732236
    2374   #=== Cell# reverse_join を生成する
     2237  #=== Cell# reverse_join を生成する
    23752238  def self.create_reverse_join
    23762239    @@cell_list.each{ |c|
     
    23842247  end
    23852248
    2386   #=== Cell# reverse_require_join を生成する
     2249  #=== Cell# reverse_require_join を生成する
    23872250  def self.create_reverse_require_join
    23882251    @@cell_list2.each{ |c|
     
    23902253      # if c.is_generate? then
    23912254        if ct then
    2392           # self への呼び口側の結合を生成
     2255          # self への呼び口側の結合を生成
    23932256          ct.create_reverse_require_join c
    23942257        end
     
    23972260  end
    23982261
    2399   #=== Cell# 受け口のport の参ç
    2400 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
    2401   # self は呼びå
    2402 ƒã®ã‚»ãƒ«
    2403   # 呼びå
    2404 ˆã‚»ãƒ«ã®å—け口の参ç
    2405 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
     2262  #=== Cell# 受け口のport の参照カウントを設定する
     2263  # self は呼び元のセル
     2264  # 呼び先セルの受け口の参照カウントをアップする
    24062265  def set_port_reference_count
    24072266    @join_list.get_items.each { |j|
    24082267      if j.get_definition.instance_of? Port then
    24092268        am = j.get_array_member2
    2410         if am then             # 呼び口é
    2411 åˆ—
     2269        if am then             # 呼び口配列
    24122270          am.each { |j2|
    2413             next if j2 == nil    # optional で一部が欠落しているケース
     2271            next if j2 == nil    # optional で一部が欠落しているケース
    24142272            cell = j2.get_rhs_cell2
    2415             next if cell == nil     # 右辺が見つからなかった.既にエラー
     2273            next if cell == nil     # 右辺が見つからなかった.既にエラー
    24162274            port = cell.get_celltype.find( j2.get_rhs_port2 )
    24172275            dbgPrint( "set_port_reference_count: #{@name}.#{j2.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    24202278        else
    24212279          cell = j.get_rhs_cell2
    2422           next if cell == nil     # 右辺が見つからなかった.既にエラー
     2280          next if cell == nil     # 右辺が見つからなかった.既にエラー
    24232281          port = cell.get_celltype.find( j.get_rhs_port2 )
    24242282          dbgPrint( "set_port_reference_count: #{@name}.#{j.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    24292287  end
    24302288
    2431   #=== Cell# 結合(Join)のチェック
    2432   #     Join は呼び口の結合または attribute の初期化
     2289  #=== Cell# 結合(Join)のチェック
     2290  #     Join は呼び口の結合または attribute の初期化
    24332291  #
    2434   #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
    2435   #  ・リレーアロケータの生成 => create_relay_allocator_join
    2436   #  ・未結合の呼び口のチェック
    2437   #  ・ポインタ型がé
    2438 åˆ—で初期化される場合のチェック
    2439   #  ・未初期化の属性のチェック
     2292  #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
     2293  #  ・リレーアロケータの生成 => create_relay_allocator_join
     2294  #  ・未結合の呼び口のチェック
     2295  #  ・ポインタ型が配列で初期化される場合のチェック
     2296  #  ・未初期化の属性のチェック
    24402297  def check_join
    24412298
    2442     # celltype がなければチェックしない(既にエラー)
     2299    # celltype がなければチェックしない(既にエラー)
    24432300    return if @celltype == nil
    24442301    return if @b_defined == false
    2445     return if @f_cloned == true    # å†
    2446 éƒ¨ã‚»ãƒ«ã«ã¤ã„ては、composite の定義時にチェックされている
     2302    return if @f_cloned == true    # 内部セルについては、composite の定義時にチェックされている
    24472303
    24482304    # debug
     
    24522308    # end
    24532309
    2454     # 未結合の呼び口のチェック
     2310    # 未結合の呼び口のチェック
    24552311    @celltype.get_port_list.each { |p|
    24562312
    2457       # 呼び口でなければ、チェックしない
     2313      # 呼び口でなければ、チェックしない
    24582314      next if p.get_port_type != :CALL
    24592315
     
    24612317      dbgPrint "check_join: #{@name} #{get_celltype.get_name} #{p.get_name}\n"
    24622318
    2463       # 結合リストの中から呼び口名に一致するものを取りだす
     2319      # 結合リストの中から呼び口名に一致するものを取りだす
    24642320      j = @join_list.get_item( p.get_name )
    24652321
    24662322      if j == nil then
    2467         # 未結合の呼び口
    2468 
    2469         # composite celltype のå†
    2470 éƒ¨ã®å ´åˆã€composite celltype が export する呼び口に結合されているか探す
     2323        # 未結合の呼び口
     2324
     2325        # composite celltype の内部の場合、composite celltype が export する呼び口に結合されているか探す
    24712326        found = false
    24722327        if @in_composite then
    2473           # composite celltype の export するものすべてから探す
    2474           # (export するものの右辺値から探すために get_item ではダメ)
     2328          # composite celltype の export するものすべてから探す
     2329          # (export するものの右辺値から探すために get_item ではダメ)
    24752330          @compositecelltypejoin_list.get_items.each{ |cj|
    2476             # 呼び口名と composite の export する名前は一致するか
     2331            # 呼び口名と composite の export する名前は一致するか
    24772332            if p.get_name == cj.get_cell_elem_name then
    24782333              found = true
     
    24812336        end
    24822337
    2483         # 呼び口é
    2484 åˆ—の場合 optional でå
    2485 ¨ã¦ã®è¦ç´ ãŒåˆæœŸåŒ–されない場合に、ここへ来る
     2338        # 呼び口配列の場合 optional で全ての要素が初期化されない場合に、ここへ来る
    24862339        if ! found && ! p.is_require? && ! p.is_optional? then
    24872340          if ! p.is_allocator_port? then
     
    24922345        end
    24932346      elsif p.get_array_size.kind_of? Integer then
    2494         # 添数あり呼び口é
    2495 åˆ—の場合、すべての添数要素が初期化されているかチェックする
     2347        # 添数あり呼び口配列の場合、すべての添数要素が初期化されているかチェックする
    24962348
    24972349        am = j.get_array_member2
    24982350        if( am )then
    2499           # join はé
    2500 åˆ—
    2501 
    2502           # 呼び口é
    2503 åˆ—定義でのé
    2504 åˆ—の大きさ
     2351          # join は配列
     2352
     2353          # 呼び口配列定義での配列の大きさ
    25052354          length = p.get_array_size
    25062355
    2507           # é
    2508 åˆ—の大きさが呼び口é
    2509 åˆ—定義と結合定義で一致するか?
     2356          # 配列の大きさが呼び口配列定義と結合定義で一致するか?
    25102357          if am.length != length then
    25112358            if ! p.is_optional? || am.length >= length then
    2512               # optional の場合、要素数が少なすぎるのは OK
     2359              # optional の場合、要素数が少なすぎるのは OK
    25132360              cdl_error( "S1044 $1: array initializer too many or few, $2 for $3" , p.get_name, am.length, length )
    25142361            end
    25152362
    2516             # am の要素に nil を追加しておく (#_CPA_# のコード生成時、このé
    2517 åˆ—要素数分生成)
     2363            # am の要素に nil を追加しておく (#_CPA_# のコード生成時、この配列要素数分生成)
    25182364            i = am.length
    25192365            while i < length
     
    25232369          end
    25242370
    2525 #          # é
    2526 åˆ—要素の抜けがないかチェック
    2527 #          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
     2371#          # 配列要素の抜けがないかチェック
     2372#          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
    25282373#            length = am.length
    25292374#          end
     
    25352380              end
    25362381            else
    2537               # 生成されないリージョンへの結合かチェック
     2382              # 生成されないリージョンへの結合かチェック
    25382383              if ! @in_composite then
    25392384                am[i].check_region2
     
    25442389
    25452390        # else
    2546         # join が非é
    2547 åˆ—であれば、既にエラー
     2391        # join が非配列であれば、既にエラー
    25482392        end
    25492393      elsif j.get_array_member then
    2550         # 添数なし呼び口é
    2551 åˆ—の場合
     2394        # 添数なし呼び口配列の場合
    25522395        am = j.get_array_member2
    25532396        length = am.length
     
    25622405        end
    25632406
    2564         # 生成されないリージョンへの結合かチェック
     2407        # 生成されないリージョンへの結合かチェック
    25652408        if ! @in_composite then
    25662409          am.each { |join|
     
    25712414        end
    25722415      else
    2573         # 呼び口[é
    2574 åˆ—」でない場合
    2575 
    2576         # 生成されないリージョンへの結合かチェック
     2416        # 呼び口[配列」でない場合
     2417
     2418        # 生成されないリージョンへの結合かチェック
    25772419        if ! @in_composite then
    25782420          j.check_region2
     
    25822424    }
    25832425
    2584     # ポインタ型がé
    2585 åˆ—で初期化される場合のチェック
     2426    # ポインタ型が配列で初期化される場合のチェック
    25862427    (@celltype.get_attribute_list+@celltype.get_var_list).each { |a|
    25872428      if a.get_size_is then
    25882429
    25892430        if a.instance_of? CompositeCelltypeJoin then
    2590           # 既にエラーになっている
     2431          # 既にエラーになっている
    25912432          # cdl_error( "S1047 size_is pointer cannot be exposed for composite attribute"  )
    25922433          next
     
    25982439          size = a.get_size_is.eval_const( @join_list, @celltype.get_name_list )
    25992440          a.get_type.set_scs( a.get_size_is, nil, nil, nil, false )
    2600           if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
    2601             # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
     2441          if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
     2442            # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
    26022443            cdl_error( "S1049 $1: size_is arg not constant" , a.get_name )
    26032444          else
     
    26152456              end
    26162457            else
    2617               # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
     2458              # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
    26182459              ini = a.get_initializer
    26192460              if ini.instance_of? Expression
     
    26302471      else
    26312472        if ! a.instance_of? CompositeCelltypeJoin then
    2632           # composite は size_is 指定できない
     2473          # composite は size_is 指定できない
    26332474          if a.get_type.kind_of?( PtrType ) then
    26342475            j = @join_list.get_item( a.get_identifier )
    26352476            if j && j.get_rhs.instance_of?( Array ) then
    2636               ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
     2477              ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
    26372478              cdl_error( "S1169 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    26382479            end
     
    26422483    }
    26432484
    2644     # 未初期化の属性をチェック
     2485    # 未初期化の属性をチェック
    26452486    @celltype.get_attribute_list.each { |a|
    26462487      b_init = false
    26472488      # self.show_tree 1
    2648       if a.get_initializer then                               # セルタイプで初期化されている
     2489      if a.get_initializer then                               # セルタイプで初期化されている
    26492490        b_init = true
    2650         # @in_composite で export されている場合には、この初期値は使われない
    2651         # export されている、いないに関わらず、初期化されていることが保証される
    2652       elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
     2491        # @in_composite で export されている場合には、この初期値は使われない
     2492        # export されている、いないに関わらず、初期化されていることが保証される
     2493      elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
    26532494        b_init = true
    26542495      elsif @in_composite && @compositecelltypejoin_list then
    2655         # 属性が export されているか調べる。export されていれば未初期化とはしない
    2656         # mikan リニアサーチ
     2496        # 属性が export されているか調べる。export されていれば未初期化とはしない
     2497        # mikan リニアサーチ
    26572498        @compositecelltypejoin_list.get_items.each{ |cj|
    2658           # 属性名と composite の export する名前は一致するか
     2499          # 属性名と composite の export する名前は一致するか
    26592500          if a.get_name.to_sym == cj.get_cell_elem_name.to_sym then
    2660             b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
     2501            b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
    26612502          end
    26622503        }
    26632504        if b_init then
    2664           # size_is の引数がマッチするかチェックする
    2665           # å†
    2666 éƒ¨ã‚»ãƒ«ã® size_is をエクスポートする size_is とマッチするかチェックする
    2667           # å†
    2668 éƒ¨ã‚»ãƒ«ã¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§åå‰ã‚’変えている可能性があるので、å†
    2669 éƒ¨ã‚»ãƒ«ã® size_is の名前を変換した上でチェックする
     2505          # size_is の引数がマッチするかチェックする
     2506          # 内部セルの size_is をエクスポートする size_is とマッチするかチェックする
     2507          # 内部セルとエクスポートで名前を変えている可能性があるので、内部セルの size_is の名前を変換した上でチェックする
    26702508          if a.get_size_is then
    26712509            ### p "attr: get_size_is"
     
    26732511            if cj.get_port_decl.instance_of? Decl then
    26742512              ### p "attr: get_size_is 2"
    2675               # cj_size_is は、外部å
    2676 ¬é–‹ã•ã‚Œã‚‹ attr の size_is
     2513              # cj_size_is は、外部公開される attr の size_is
    26772514              cj_size_is = cj.get_port_decl.get_size_is
    26782515              if cj_size_is == nil then
     
    26832520              remain = exprs
    26842521              inner_to_export = {}
    2685                           ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
     2522                          ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
    26862523              while remain != "" && remain != nil
    26872524                ### p "remain ", remain
    2688                 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
     2525                remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
    26892526                                if $2 == nil then
    26902527                                                break
     
    26932530                remain = $'
    26942531                ### p exprs, $1, $2, $'
    2695                 # size_is に含まれる変数は、composite で export されているか
     2532                # size_is に含まれる変数は、composite で export されているか
    26962533                cj2 = nil
    26972534                @compositecelltypejoin_list.get_items.each{ |cj2t|
     
    27062543                if cj2.get_port_decl.instance_of? Decl then
    27072544                   decl2 = cj2.get_port_decl
    2708                    # å†
    2709 éƒ¨ã®åå‰ã¨å¤–部の名前の対応関係を記憶
     2545                   # 内部の名前と外部の名前の対応関係を記憶
    27102546                   inner_to_export[arg_name] = decl2.get_name
    2711                 # else cj2 は Port (既にエラー)
     2547                # else cj2 は Port (既にエラー)
    27122548                end
    27132549              end
    2714               # å†
    2715 éƒ¨ã®åå‰ã‚’外部の名前で置換
     2550              # 内部の名前を外部の名前で置換
    27162551              inner_to_export.each{ |arg_name, exp_name|
    27172552                ### p "changing #{arg_name}=>#{exp_name}"
    27182553                # exprs.gsub!( Regexp.new("#{arg_name}[^0-9A-Za-z_]"), exp_name.to_s )
    2719                 exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
    2720                 exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
     2554                exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
     2555                exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
    27212556              }
    27222557              ### p "changed: #{exprs} #{cj_size_is.to_s}"
     
    27242559                cdl_error( "S1172 \'$1\' size_is argument mismatch with exporting one \'$2\'", a.get_name, cj.get_name )
    27252560              end
    2726             # else cj は Port (既にエラー)
     2561            # else cj は Port (既にエラー)
    27272562            end
    27282563          end
     
    27372572  end
    27382573
    2739   #=== Cell# 逆 require をチェックする
    2740   # 逆 require 指定された受け口に複数の結合がないかチェックする
    2741   # composite のå†
    2742 éƒ¨ã‚»ãƒ« (f_cloned=true) もチェックする
     2574  #=== Cell# 逆 require をチェックする
     2575  # 逆 require 指定された受け口に複数の結合がないかチェックする
     2576  # composite の内部セル (f_cloned=true) もチェックする
    27432577  def check_reverse_require
    2744     # celltype がなければチェックしない(既にエラー)
     2578    # celltype がなければチェックしない(既にエラー)
    27452579    return if @celltype == nil
    27462580    return if @b_defined == false
    27472581
    27482582    # p "check reverse require   #{@name}"
    2749     # 逆require 指定された受け口に複数の結合がないかチェック
     2583    # 逆require 指定された受け口に複数の結合がないかチェック
    27502584    @referenced_port_list.each{ |port,count|
    27512585      # p port.class, count
     
    27572591  end
    27582592
    2759   #=== Cell# require 呼び口の結合を行う
     2593  #=== Cell# require 呼び口の結合を行う
    27602594  # STAGE: S
    2761   #cp_name:: Symbol           : 呼び口名
    2762   #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
    2763   #port::  Port               : celltype の Port オブジェクト
     2595  #cp_name:: Symbol           : 呼び口名
     2596  #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
     2597  #port::  Port               : celltype の Port オブジェクト
    27642598  def set_require_join( cp_name, cell_or_ct, port )
    27652599
    2766     # set_require_join は2度呼び出される
    2767     # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
     2600    # set_require_join は2度呼び出される
     2601    # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
    27682602    # if @require_joined_list[ cp_name ] then
    27692603    #   return
     
    27822616      end
    27832617    else
    2784       # require: cell で指定
     2618      # require: cell で指定
    27852619      cell = cell_or_ct
    27862620      if @region.distance( cell.get_region ) == nil then
     
    27922626      cdl_warning( "W1003 $1 : require call port overridden in $2" , cp_name, @name )
    27932627    else
    2794       # require の join を生成(呼び口の結合)
     2628      # require の join を生成(呼び口の結合)
    27952629#      rhs = Expression.new( [ :OP_DOT, [ :IDENTIFIER, Token.new( cell.get_name, nil, nil, nil ) ],
    27962630      nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    28052639  end
    28062640
    2807   #=== Cell# Join の definition の設定とチェック
     2641  #=== Cell# Join の definition の設定とチェック
    28082642  # STAGE: S
    28092643  def set_definition_join
    2810     return if @celltype == nil    # 既にエラー:打ち切る
    2811     return if @b_defined == false # プロトタイプ宣言のみ
    2812     return if @b_checked == true  # 既に設定(チェック)済み
     2644    return if @celltype == nil    # 既にエラー:打ち切る
     2645    return if @b_defined == false # プロトタイプ宣言のみ
     2646    return if @b_checked == true  # 既に設定(チェック)済み
    28132647
    28142648    dbgPrint "set_definition_join in #{@name}\n"
    28152649
    2816     # relay allocator をたどって再å
    2817 ¥ã—ないよう、å
    2818 ˆé ­ã§ @b_checked を true にする
     2650    # relay allocator をたどって再入しないよう、先頭で @b_checked を true にする
    28192651    @b_checked = true
    28202652
     
    28222654      check_restrict_list
    28232655     
    2824       # compoiste セルのクローンされたものは、set_definition 不要
    2825       # å
    2826 ƒã® join は既に definition されている
    2827       # å
    2828 ƒã®ã‚»ãƒ«ã«ãŠã„て、代å
    2829 ¥ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„るので、二重にチェック(through適用)されてしまう
     2656      # compoiste セルのクローンされたものは、set_definition 不要
     2657      # 元の join は既に definition されている
     2658      # 元のセルにおいて、代入チェックされているので、二重にチェック(through適用)されてしまう
    28302659      @join_list.get_items.each{ |join|
    28312660        dbgPrint " set_definition_join: checking #{@name}.#{join.get_name}\n"
     
    28332662          port = @celltype.find(join.get_name)
    28342663          join.get_array_member2.each { |am|
    2835             if am == nil then   # 未結合の場合、エラーチェックは check_join
     2664            if am == nil then   # 未結合の場合、エラーチェックは check_join
    28362665              if port && ! port.is_optional? then
    2837                 # テスト用にエラーメッセージ出力
     2666                # テスト用にエラーメッセージ出力
    28382667                # cdl_error( "TEMPORAL set_definition_join: uninitialized array member"  )
    28392668              end
     
    28482677    end
    28492678
    2850     # リレー join は through プラグイン生成後にしかできない
    2851     # through 後に結合å
    2852 ˆãŒå
    2853 ¥ã‚Œæ›¿ãˆã‚‰ã‚Œã‚‹
     2679    # リレー join は through プラグイン生成後にしかできない
     2680    # through 後に結合先が入れ替えられる
    28542681    create_relay_allocator_join
    28552682
    2856     # composite セルの展開
     2683    # composite セルの展開
    28572684    if ! @in_composite && ! @f_cloned && @celltype.instance_of?( CompositeCelltype ) then
    2858       # composite セルタイプå†
    2859 ã® composite は展開しない
    2860       # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand å†
    2861 ã§å†å¸°çš„に expnad)
     2685      # composite セルタイプ内の composite は展開しない
     2686      # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand 内で再帰的に expnad)
    28622687      expand
    28632688    end
    28642689
    2865     # celltype に generate が指定されされているか
     2690    # celltype に generate が指定されされているか
    28662691    celltype_plugin = @celltype.get_celltype_plugin
    28672692    if celltype_plugin then
     
    28752700  end
    28762701
    2877   #=== Cell# composite セルの展開
    2878   # このセルが composite セルタイプ
     2702  #=== Cell# composite セルの展開
     2703  # このセルが composite セルタイプ
    28792704  def expand
    28802705
     
    28822707    dbgPrint "expanding #{@name} #{@celltype.get_name}\n"
    28832708
    2884     # 展開されたセルのリスト
     2709    # 展開されたセルのリスト
    28852710    @@cloned_cell_list = {}
    28862711
    2887     # composite celltype の cell を展開
     2712    # composite celltype の cell を展開
    28882713    @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    28892714
    2890     # プロトタイプが参ç
    2891 §ã•ã‚Œã¦ã„る場合、子も参ç
    2892 §ã•ã‚Œã¦ã„ることにする
     2715    # プロトタイプが参照されている場合、子も参照されていることにする
    28932716    if @f_ref then
    28942717      dbgPrint "expand: set_f_ref\n"
     
    28962719    end
    28972720
    2898     # 呼び口の右辺のセルを clone したものに変更
     2721    # 呼び口の右辺のセルを clone したものに変更
    28992722    self.change_rhs_port
    29002723
    2901     # プロトタイプ宣言で設定されていたものを反映する
     2724    # プロトタイプ宣言で設定されていたものを反映する
    29022725    @entry_array_max_subscript.each{ |port,name|
    29032726      set_entry_inner_port_max_subscript( port, name )
     
    29052728  end
    29062729
    2907   #=== Cell#restrict を追加
     2730  #=== Cell#restrict を追加
    29082731  def add_restrict( entry_name, func_name, region_name_list )
    29092732    if @restrict_list[ entry_name ] then
     
    29942817      puts "entry array #{port.get_name}: max subscript=#{num}"
    29952818    }
    2996     if @cell_list then   # ここで @cell_list が nil なのは Bug
     2819    if @cell_list then   # ここで @cell_list が nil なのは Bug
    29972820      (indent+1).times { print "  " }
    29982821      puts "cloned cell list:"
     
    30182841          subscript = ""
    30192842        end
    3020         # アロケータ呼び口の結合を生成
     2843        # アロケータ呼び口の結合を生成
    30212844        (indent+2).times { print "  " }
    30222845        puts "#{cp_name}#{subscript} = #{a[4+1]}"
     
    30422865# @real_singleton:: bool : has singleton cell in this composite celltype
    30432866# @real_active:: bool : has active cell in this composite celltype
    3044 # @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
     2867# @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
    30452868# @internal_allocator_list:: [ [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], ... ]
    30462869
     
    30822905
    30832906    Namespace.new_compositecelltype( self )
    3084     set_namespace_path # @NamespacePath の設定
     2907    set_namespace_path # @NamespacePath の設定
    30852908
    30862909    @port_list = []
     
    30982921  def end_of_parse
    30992922
    3100     # singleton に関するチェック
     2923    # singleton に関するチェック
    31012924    if @b_singleton && @real_singleton == nil then
    31022925      cdl_warning( "W1004 $1 : specified singleton but has no singleton in this celltype" , @name )
     
    31072930    end
    31082931
    3109     # active に関するチェック
     2932    # active に関するチェック
    31102933    if @b_active && @real_active == nil then
    31112934      cdl_error( "S1054 $1 : specified active but has no active in this celltype" , @name )
     
    31142937    end
    31152938
    3116     # @allocator_instance を設定する
     2939    # @allocator_instance を設定する
    31172940    @name_list.get_items.each{ |n|
    31182941      if n.instance_of? Port then
     
    31212944    }
    31222945
    3123     # リレーアロケータの entry 側
     2946    # リレーアロケータの entry 側
    31242947    @port_list.each{ |p|
    31252948      if p.get_port_type == :ENTRY then
     
    31352958      end
    31362959    }
    3137     # mikan relay が正しく抜けているかチェックされていない
    3138 
    3139     # 意味解析
     2960    # mikan relay が正しく抜けているかチェックされていない
     2961
     2962    # 意味解析
    31402963    @cell_list.get_items.each{ |c|
    31412964      c.set_definition_join
    31422965    }
    31432966
    3144     # cell の未結合の呼び口がないかチェック
     2967    # cell の未結合の呼び口がないかチェック
    31452968    @cell_list.get_items.each{ |c|
    31462969      c.check_join
     
    31482971    }
    31492972
    3150     # 呼び口の結合について、export とå†
    3151 éƒ¨çµåˆã®ä¸¡æ–¹ãŒãªã„かチェック
    3152     # リレーアロケータ、å†
    3153 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     2973    # 呼び口の結合について、export と内部結合の両方がないかチェック
     2974    # リレーアロケータ、内部アロケータの設定
    31542975    @port_list.each{ |p|
    31552976      p.check_dup_init
    31562977    }
    31572978
    3158     # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
     2979    # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
    31592980    @name_list.get_items.each{ |n|
    31602981      if( @export_name_list.get_item( n.get_name ) == nil )then
     
    31632984    }
    31642985
    3165     # å†
    3166 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’設定する
     2986    # 内部アロケータを設定する
    31672987    @internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    31682988      res = ext_alloc_ent.get_allocator_rhs_elements( :INTERNAL_ALLOC )
     
    31953015    cell.set_owner self  # Cell (in_omposite)
    31963016    @cell_list.add_item( cell )
    3197     if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
     3017    if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
    31983018      if cell.get_celltype.is_singleton? then
    31993019        @real_singleton = cell
     
    32133033  end
    32143034
    3215   #=== CompositeCelltype# CompositeCelltypeJoin を作成
     3035  #=== CompositeCelltype# CompositeCelltypeJoin を作成
    32163036  # STAGE: B
    3217   #export_name:: Symbol : 外部にå
    3218 ¬é–‹ã™ã‚‹åå‰
    3219   #internal_cell_name:: Symbol : å†
    3220 éƒ¨ã‚»ãƒ«å
    3221   #internal_cell_elem_name:: Symbol : å†
    3222 éƒ¨ã‚»ãƒ«ã®è¦ç´ åï¼ˆå‘¼ã³å£åã€å—け口名、属性名のいずれか)
    3223   #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
    3224   #RETURN:: Decl | Port : エクスポート定義
    3225   # new_join は
    3226   #   cCall => composite.cCall;     (セルå†
    3227 )
    3228   #   attr = composite.attr;        (セルå†
    3229 )
    3230   #   composite.eEnt => cell2.eEnt; (セル外)
    3231   # の構文要素の出現に対して呼び出される
     3037  #export_name:: Symbol : 外部に公開する名前
     3038  #internal_cell_name:: Symbol : 内部セル名
     3039  #internal_cell_elem_name:: Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか)
     3040  #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
     3041  #RETURN:: Decl | Port : エクスポート定義
     3042  # new_join は
     3043  #   cCall => composite.cCall;     (セル内)
     3044  #   attr = composite.attr;        (セル内)
     3045  #   composite.eEnt => cell2.eEnt; (セル外)
     3046  # の構文要素の出現に対して呼び出される
    32323047  def new_join( export_name, internal_cell_name,
    32333048                 internal_cell_elem_name, type )
     
    32423057
    32433058    celltype = cell.get_celltype
    3244     return if celltype == nil   # celltype == nil ならすでにエラー
    3245 
    3246     # å†
    3247 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—から対応要素を探す
    3248     # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
    3249     # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
     3059    return if celltype == nil   # celltype == nil ならすでにエラー
     3060
     3061    # 内部セルのセルタイプから対応要素を探す
     3062    # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
     3063    # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
    32503064    obj = celltype.find( internal_cell_elem_name )
    32513065    if obj.instance_of?( Decl ) then
     
    32553069      elsif type != :ATTRIBUTE then
    32563070        cdl_error( "S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute" , export_name )
    3257         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3071        # return 次のエラーを避けるために処理続行し、付け加えてみる
    32583072      end
    32593073    elsif obj.instance_of?( Port ) then
    32603074      if obj.get_port_type != type then
    32613075        cdl_error( "S1060 \'$1\' : port type mismatch. $2 type is allowed here." , export_name, type )
    3262         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3076        # return 次のエラーを避けるために処理続行し、付け加えてみる
    32633077      end
    32643078    else
     
    32683082    end
    32693083
    3270     # エクスポート定義と一致するかどうかチェック
     3084    # エクスポート定義と一致するかどうかチェック
    32713085    obj2 = @name_list.get_item( export_name )
    32723086    if( obj2 == nil )then
     
    32843098        elsif obj.get_signature != obj2.get_signature then
    32853099          if obj.get_signature != nil && obj2.get_signature != nil then
    3286             # nil ならば既にエラーなので報告しない
     3100            # nil ならば既にエラーなので報告しない
    32873101            cdl_error( "S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'" , export_name, obj.get_signature.get_name, obj2.get_signature.get_name )
    32883102          end
     
    33093123    if obj.instance_of?( Decl ) then
    33103124      # attribute
    3311 #      # å†
    3312 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3125#      # 内部から外部へ複数の結合がないかチェック
    33133126#      found = false
    33143127#      @attr_list.each{ |a|
     
    33233136    else
    33243137      # call/entry port
    3325 #      # å†
    3326 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3138#      # 内部から外部へ複数の結合がないかチェック
    33273139#      found = false
    33283140#      @port_list.each{ |port|
     
    33373149    end
    33383150
    3339     # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
     3151    # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
    33403152    if obj.instance_of?( Decl ) && @export_name_list.get_item( export_name ) then
    3341       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3153      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    33423154    elsif obj.instance_of?( Port ) && obj.get_port_type == :CALL && @export_name_list.get_item( export_name ) then
    3343       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3155      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    33443156    else
    33453157      @export_name_list.add_item( join )
    33463158    end
    33473159
    3348     # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
     3160    # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
    33493161    if obj2.instance_of? Port then
    33503162      obj2.each_param{ |port, fd, par|
    3351         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3163        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    33523164        when :SEND, :RECEIVE
    3353           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3354           #            ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     3165          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3166          #            ポート名         関数名         パラメータ名
    33553167          cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}"
    33563168
    3357           # リレーアロケータ or å†
    3358 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3359           # この時点では get_allocator_instance では得られないため tmp を得る
     3169          # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3170          # この時点では get_allocator_instance では得られないため tmp を得る
    33603171          if port.get_allocator_instance_tmp then
    33613172            found = false
     
    33653176
    33663177                if s[0] == :INTERNAL_ALLOC then
    3367                   # å†
    3368 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®å ´åˆ    # mikan これはå†
    3369 éƒ¨ã®ã‚»ãƒ«ã«ç›´çµã™ã‚‹ã€‚外部のポートに改めるべき
     3178                  # 内部アロケータの場合    # mikan これは内部のセルに直結する。外部のポートに改めるべき
    33703179                  @internal_allocator_list << [ cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3] ]
    33713180                end
     
    33773186          end
    33783187
    3379           # 外部アロケータの場合
     3188          # 外部アロケータの場合
    33803189          new_join( cp_name, internal_cell_name, cp_internal_name, :CALL )
    33813190        end
     
    33833192    end
    33843193
    3385     # エクスポート定義を返す
     3194    # エクスポート定義を返す
    33863195    return obj2
    33873196  end
     
    34053214    @name_list.add_item port
    34063215
    3407     # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
    3408     # この時点ではå†
    3409 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‹ã©ã†ã‹åˆ¤æ–­ã§ããªã„ので、とりあえず生成しておく
     3216    # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
     3217    # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく
    34103218    port.each_param { |port, fd, par|
    3411       case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3219      case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    34123220      when :SEND, :RECEIVE
    3413         #### リレーアロケータ or å†
    3414 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3415         # å†
    3416 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3417         # この時点では get_allocator_instance では得られないため tmp を得る
     3221        #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3222        # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3223        # この時点では get_allocator_instance では得られないため tmp を得る
    34183224        if port.get_allocator_instance_tmp then
    34193225          found = false
     
    34303236
    34313237        if par.get_allocator then
    3432           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3433           #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    3434           alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
    3435           array_size = port.get_array_size            # 呼び口または受け口é
    3436 åˆ—のサイズ
    3437           created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     3238          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3239          #           ポート名          関数名         パラメータ名
     3240          alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
     3241          array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     3242          created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    34383243          created_port.set_allocator_port( port, fd, par )
    34393244          if port.is_omit? then
    34403245            created_port.set_omit
    34413246          end
    3442           new_port( created_port )           # セルタイプに新しい呼び口を追加
     3247          new_port( created_port )           # セルタイプに新しい呼び口を追加
    34433248        # else
    34443249        #   already error
     
    34573262    attribute.each { |a|
    34583263      a.set_owner self   # Decl (CompositeCelltype)
    3459       # V1.1.0.10 composite の attr の size_is は可となった
     3264      # V1.1.0.10 composite の attr の size_is は可となった
    34603265      # if a.get_size_is then
    34613266      #  cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name )
     
    34683273  end
    34693274
    3470   #=== CompositeCelltype# 逆require の結合を生成する
     3275  #=== CompositeCelltype# 逆require の結合を生成する
    34713276  def create_reverse_require_join cell
    34723277    @name_list.get_items.each{ |n|
     
    34933298    return @name_list.get_item( name )
    34943299
    3495     # 従来仕様
     3300    # 従来仕様
    34963301#    cj = @export_name_list.get_item( name )
    34973302#p "#{name}, #{cj.get_port_decl}"
     
    35033308  end
    35043309
    3505   #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
     3310  #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
    35063311  #name:: string:
    3507   # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
     3312  # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
    35083313  def find_export name
    35093314    return @export_name_list.get_item( name )
    35103315  end
    35113316
    3512   #=== CompositeCelltype# composite celltype の cell を展開
    3513   #name:: string: Composite cell の名前
    3514   #global_name:: string: Composite cell の global name (C 言語名)
    3515   #join_list:: NamedList : Composite cell に対する Join の NamedList
     3317  #=== CompositeCelltype# composite celltype の cell を展開
     3318  #name:: string: Composite cell の名前
     3319  #global_name:: string: Composite cell の global name (C 言語名)
     3320  #join_list:: NamedList : Composite cell に対する Join の NamedList
    35163321  #RETURN:
    35173322  # [ { name => cell }, [ cell, ... ] ]
    3518   #  戻り値 前は 名前⇒cloneされたå†
    3519 éƒ¨ã‚»ãƒ«ã€å¾Œã‚ã¯ composite の出現順のリスト
     3323  #  戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト
    35203324  def expand( name, global_name, namespacePath, join_list, region, plugin, locale )
    35213325
     
    35263330    }
    35273331 
    3528     # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
     3332    # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
    35293333    clone_cell_list = {}
    35303334    clone_cell_list2 = []
    35313335
    3532     #  composite å†
    3533 éƒ¨ã®ã™ã¹ã¦ã® cell について
     3336    #  composite 内部のすべての cell について
    35343337    @cell_list.get_items.each { |c|
    35353338
     
    35373340      dbgPrint "expand : cell #{c.get_name}\n"
    35383341
    3539       # Join のé
    3540 åˆ—
     3342      # Join の配列
    35413343      ja = []
    35423344
    3543       # CompositeCelltype が export する呼び口、受け口、属性のリストについて
     3345      # CompositeCelltype が export する呼び口、受け口、属性のリストについて
    35443346      # @export_name_list.get_items.each{ |cj|  # cj: CompositeCelltypeJoin
    3545       # 新仕様では、@export_name_list にå
    3546 ¥ã£ã¦ã„ない attr がありうる
     3347      # 新仕様では、@export_name_list に入っていない attr がありうる
    35473348      (@port_list+@attr_list).each{ |cj|        # cj: CompositeCelltypeJoin
    35483349
     
    35503351        dbgPrint "        cj : #{cj.get_name}\n"
    35513352
    3552         # CompositeCelltypeJoin (export) の対象セルか?
     3353        # CompositeCelltypeJoin (export) の対象セルか?
    35533354        if cj.match?( c ) then
    35543355
    3555           # 対象セルå†
    3556 ã® CompositeCelltype の export する Join (attribute または call port)
     3356          # 対象セル内の CompositeCelltype の export する Join (attribute または call port)
    35573357          j = join_list.get_item( cj.get_name )
    35583358
     
    35653365
    35663366          if j then
    3567             # 呼び口、属性の場合
    3568             #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
     3367            # 呼び口、属性の場合
     3368            #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
    35693369            # p "expand: cloning Join #{j.get_name} #{@name} #{name}"
    35703370            jc = j.clone_for_composite( @name, name, locale )
     
    35743374            # p "cn #{jc.get_name} #{cj.get_cell_elem_name}"
    35753375
    3576             # 対象セルの呼び口または属性の名前に変更
     3376            # 対象セルの呼び口または属性の名前に変更
    35773377            jc.change_name( cj.get_cell_elem_name )
    35783378
    3579             # 対象セルに対する Join のé
    3580 åˆ—
     3379            # 対象セルに対する Join の配列
    35813380            ja << jc
    35823381          end
     
    35903389      dbgPrint "expand : clone #{name}_#{c.get_name}\n"
    35913390
    3592       # セルの clone を生成
     3391      # セルの clone を生成
    35933392#      clone_cell_list[ "#{name}_#{c.get_name}" ] =  c.clone_for_composite( name, global_name, ja )
    35943393      c2 =  c.clone_for_composite( name, global_name, namespacePath, ja, @name, region, plugin, locale )
     
    36003399    clone_cell_list.each { |nm,c|
    36013400      dbgPrint "  cloned: #{nm} = #{c.get_global_name}\n"
    3602       # join の owner を clone されたセルに変更する V1.1.0.25
     3401      # join の owner を clone されたセルに変更する V1.1.0.25
    36033402      c.get_join_list.get_items.each{ |j|
    36043403        j.set_cloned( clone_cell_list[ "#{c.get_local_name}" ] )
     
    36083407  end
    36093408
    3610   #=== CompositeCelltype 指定子リストの設定
     3409  #=== CompositeCelltype 指定子リストの設定
    36113410  def set_specifier_list( spec_list )
    36123411    return if spec_list == nil
     
    36393438
    36403439  def get_var_list
    3641     []   # 空のé
    3642 åˆ—を返す
     3440    []   # 空の配列を返す
    36433441  end
    36443442
     
    36473445  end
    36483446
    3649   #== CompositeCelltype# generate 指定子のæƒ
    3650 å ±
    3651   # CompositeCelltype には generate が指定できないので nil を返す
    3652   # Celltype::@generate を参ç
    3653 §ã®ã“と
     3447  #== CompositeCelltype# generate 指定子の情報
     3448  # CompositeCelltype には generate が指定できないので nil を返す
     3449  # Celltype::@generate を参照のこと
    36543450  def get_celltype_plugin
    36553451    nil
     
    36643460  end
    36653461
    3666   #=== CompositeCelltype# アクティブではない
    3667   # active ではないに加え、å
    3668 ¨ã¦ã®å†
    3669 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—が inactive の場合に inactive
    3670   # (å†
    3671 éƒ¨ã®ã‚»ãƒ«ãŒ active または factory を持っている)
     3462  #=== CompositeCelltype# アクティブではない
     3463  # active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive
     3464  # (内部のセルが active または factory を持っている)
    36723465  def is_inactive?
    36733466    if @b_active == false then
    36743467      @cell_list.get_items.each{ |c|
    36753468        if c.get_celltype && c.get_celltype.is_inactive? == false then
    3676           # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
     3469          # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
    36773470          return false
    36783471        end
     
    37143507
    37153508
    3716 #== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
     3509#== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
    37173510class Port < BDNode
    37183511# @name::  str
     
    37203513# @port_type::  :CALL, :ENTRY
    37213514# @array_size:: nil: not array, "[]": sizeless, Integer: sized array
    3722 # @reverse_require_cell_path:: NamespacePath :     é€†require呼びå
    3723 ƒã‚»ãƒ«  mikan namespace (呼び口のみ指定可能)
    3724 # @reverse_require_callport_name:: Symbol:  逆require呼びå
    3725 ƒã‚»ãƒ«ã®å‘¼ã³å£å
     3515# @reverse_require_cell_path:: NamespacePath :     逆require呼び元セル  mikan namespace (呼び口のみ指定可能)
     3516# @reverse_require_callport_name:: Symbol:  逆require呼び元セルの呼び口名
    37263517#
    3727 # set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
    3728 # @allocator_port:: Port : この呼び口ができるå
    3729 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口
    3730 # @allocator_func_decl:: Decl : この呼び口ができるå
    3731 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口の関数
    3732 # @allocator_param_decl:: ParamDecl : この呼び口ができるå
    3733 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口のパラメータ
     3518# set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
     3519# @allocator_port:: Port : この呼び口ができる元となった呼び口または受け口
     3520# @allocator_func_decl:: Decl : この呼び口ができる元となった呼び口または受け口の関数
     3521# @allocator_param_decl:: ParamDecl : この呼び口ができる元となった呼び口または受け口のパラメータ
    37343522#
    3735 # set_specifier によって設定される(
     3523# set_specifier によって設定される(
    37363524# @allocator_instance:: Hash : {"func_param" => [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]}
    37373525#                                               [:INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
     
    37393527#                                                                                    function    parameter   rhs
    37403528#
    3741 # @b_require:: bool : require により生成された call port の場合 true
    3742 # @b_has_name:: bool : require : 名前ありのリクワイア呼び口
    3743 # @b_inline:: bool : entry port のみ
    3744 # @b_omit:: bool : omit 指定子が指定された (call port のみ)
    3745 # @b_optional:: bool : call port のみ
    3746 # @b_ref_des:: bool :  ref_desc キーワードが指定された
    3747 # @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
     3529# @b_require:: bool : require により生成された call port の場合 true
     3530# @b_has_name:: bool : require : 名前ありのリクワイア呼び口
     3531# @b_inline:: bool : entry port のみ
     3532# @b_omit:: bool : omit 指定子が指定された (call port のみ)
     3533# @b_optional:: bool : call port のみ
     3534# @b_ref_des:: bool :  ref_desc キーワードが指定された
     3535# @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
    37483536#
    37493537# optimize::
    3750 # @celltype:: 属するセルタイプ
     3538# @celltype:: 属するセルタイプ
    37513539#
    3752 # :CALL の場合の最適化
    3753 # @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
    3754 # @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    3755 # @b_cell_unique:: bool                     # 呼びå
    3756 ˆã¯å”¯ä¸€ã®ã‚»ãƒ«
    3757 # @only_callee_port:: Port                  # 唯一の呼びå
    3758 ˆãƒãƒ¼ãƒˆ
    3759 # @only_callee_cell:: Cell                  # 唯一の呼びå
    3760 ˆã‚»ãƒ« (@b_PEPDES_in_CB_useless = true の時有効)
     3540# :CALL の場合の最適化
     3541# @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
     3542# @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3543# @b_cell_unique:: bool                     # 呼び先は唯一のセル
     3544# @only_callee_port:: Port                  # 唯一の呼び先ポート
     3545# @only_callee_cell:: Cell                  # 唯一の呼び先セル (@b_PEPDES_in_CB_useless = true の時有効)
    37613546#
    3762 # :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
    3763 # @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
    3764 # @b_skelton_useless:: bool                 # スケルトン関数不要
     3547# :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
     3548# @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
     3549# @b_skelton_useless:: bool                 # スケルトン関数不要
    37653550
    37663551  def initialize( name, sig_path, port_type, array_size = nil, reverse_require_cell_path = nil, reverse_require_entry_port_name = nil )
     
    37783563        @array_size = array_size.eval_const(nil)
    37793564      else
    3780         @array_size = array_size   # これはアロケータ呼び口の場合(å
    3781 ƒã®å‘¼ã³å£ã§æ—¢ã«è©•ä¾¡æ¸ˆã¿ï¼‰
     3565        @array_size = array_size   # これはアロケータ呼び口の場合(元の呼び口で既に評価済み)
    37823566      end
    37833567      if @array_size == nil then
     
    37943578    object = Namespace.find( sig_path )    #1
    37953579    if object == nil then
    3796       # mikan signature の名前が不完å
    3797 ¨
     3580      # mikan signature の名前が不完全
    37983581      cdl_error( "S1075 \'$1\' signature not found" , sig_path )
    37993582    elsif ! object.instance_of?( Signature ) then
    3800       # mikan signature の名前が不完å
    3801 ¨
     3583      # mikan signature の名前が不完全
    38023584      cdl_error( "S1076 \'$1\' not signature" , sig_path )
    38033585    else
     
    38063588    end
    38073589
    3808     # 逆require
     3590    # require
    38093591    @reverse_require_cell_path       = nil
    38103592    @reverse_require_entry_port_name = nil
     
    38163598        @reverse_require_entry_port_name = reverse_require_entry_port_name
    38173599
    3818         # 受け口é
    3819 åˆ—か?
     3600        # 受け口配列か?
    38203601        if array_size then
    38213602          cdl_error( "S1153 $1: cannot be entry port array for fixed join port", @name )
    38223603        end
    38233604
    3824         # 呼び口のセルタイプを探す
     3605        # 呼び口のセルタイプを探す
    38253606        ct_or_cell = Namespace.find( @reverse_require_cell_path )  #1
    38263607        if ct_or_cell.instance_of? Cell then
     
    38373618
    38383619        if ct == nil then
    3839           return    # 既にエラー
    3840         end
    3841 
    3842         # 添え字なしの呼び口é
    3843 åˆ—か?
     3620          return    # 既にエラー
     3621        end
     3622
     3623        # 添え字なしの呼び口配列か?
    38443624        port = ct.find( @reverse_require_entry_port_name )
    38453625        if port == nil || port.get_port_type != :CALL
     
    38633643  end
    38643644
    3865   #=== Port#最適化に関する変数をリセットする
    3866   # Region ごとに最適化のやりなおしをするため、リセットする
     3645  #=== Port#最適化に関する変数をリセットする
     3646  # Region ごとに最適化のやりなおしをするため、リセットする
    38673647  def reset_optimize
    38683648    if @port_type == :CALL then
    38693649      # call port optimize
    3870       @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    3871       @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    3872       @b_cell_unique = false                     # 唯一の呼びå
    3873 ˆã‚»ãƒ«
    3874       @only_callee_port = nil                    # 唯一の呼びå
    3875 ˆãƒãƒ¼ãƒˆ
    3876       @only_callee_cell = nil                    # 唯一の呼びå
    3877 ˆã‚»ãƒ«
     3650      @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     3651      @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3652      @b_cell_unique = false                     # 唯一の呼び先セル
     3653      @only_callee_port = nil                    # 唯一の呼び先ポート
     3654      @only_callee_cell = nil                    # 唯一の呼び先セル
    38783655    else
    38793656      # entry port optimize
    38803657      if $unopt then
    3881         # 最適化なし
    3882         @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    3883         @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3658        # 最適化なし
     3659        @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     3660        @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    38843661      else
    3885         # 最適化あり
    3886         @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
    3887         @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3662        # 最適化あり
     3663        @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
     3664        @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
    38883665      end
    38893666    end
     
    39143691  end
    39153692
    3916   #=== Port# アロケータポートの設定
    3917   #port:: Port : send/receive のあった呼び口または受け口
    3918   #fd:: Decl : 関数の declarator
    3919   #par:: ParamDecl : send/receive のあった引数
    3920   # この呼び口が生成されるもとになった呼び口または受け口のæƒ
    3921 å ±ã‚’設定
     3693  #=== Port# アロケータポートの設定
     3694  #port:: Port : send/receive のあった呼び口または受け口
     3695  #fd:: Decl : 関数の declarator
     3696  #par:: ParamDecl : send/receive のあった引数
     3697  # この呼び口が生成されるもとになった呼び口または受け口の情報を設定
    39223698  def set_allocator_port( port, fd, par )
    39233699    @allocator_port = port
     
    39513727  end
    39523728
    3953   #=== Port# require 呼び口が名前を持つ?
    3954   # require 限定
     3729  #=== Port# require 呼び口が名前を持つ?
     3730  # require 限定
    39553731  def has_name?
    39563732    @b_has_name
     
    39653741  end
    39663742
    3967   #=== Port# omit 指定されている?
     3743  #=== Port# omit 指定されている?
    39683744  def is_omit?
    39693745    @b_omit || ( @signature && @signature.is_empty? )
     
    39743750  end
    39753751
    3976   def set_VMT_useless                     # VMT 関数テーブルを使用しない
     3752  def set_VMT_useless                     # VMT 関数テーブルを使用しない
    39773753   @b_VMT_useless = true
    39783754  end
    39793755
    3980   def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3756  def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    39813757    @b_skelton_useless = true
    39823758  end
    39833759
    3984   def set_cell_unique                     # 呼びå
    3985 ˆã‚»ãƒ«ã¯ä¸€ã¤ã ã‘
     3760  def set_cell_unique                     # 呼び先セルは一つだけ
    39863761    @b_cell_unique = true
    39873762  end
    39883763
    3989   #=== Port# 呼び口/受け口の指定子の設定
    3990   # inline, allocator の指定
     3764  #=== Port# 呼び口/受け口の指定子の設定
     3765  # inline, allocator の指定
    39913766  def set_specifier spec_list
    39923767    spec_list.each { |s|
     
    40333808  end
    40343809
    4035   #=== Port# リレーアロケータ、å†
    4036 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’設定
    4037   # 呼び口の前方参ç
    4038 §å¯èƒ½ãªã‚ˆã†ã«ã€ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の解釈の最後で行う
     3810  #=== Port# リレーアロケータ、内部アロケータのインスタンスを設定
     3811  # 呼び口の前方参照可能なように、セルタイプの解釈の最後で行う
    40393812  def set_allocator_instance
    40403813    if @allocator_instance_tmp == nil then
     
    40493822      case alloc_type
    40503823      when :INTERNAL_ALLOC
    4051         if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
    4052           cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
     3824        if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
     3825          cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
    40533826          next
    40543827        end
     
    40573830        # OK
    40583831      when :NORMAL_ALLOC
    4059         # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
     3832        # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
    40603833        cdl_error( "S1174 $1 not suitable for lhs, suitable lhs: 'func.param'", "#{ai[1]}.#{ai[3]}.#{ai[4]}" )
    40613834        next
     
    40643837      end
    40653838
    4066       # '=' 左辺(func_name,param_name)は実在するか?
    4067       if @signature then       # signature = nil なら既にエラー
     3839      # '=' 左辺(func_name,param_name)は実在するか?
     3840      if @signature then       # signature = nil なら既にエラー
    40683841        fh = @signature.get_function_head( ai[1] )
    40693842        if fh == nil then
     
    40733846        decl = fh.get_declarator
    40743847        if ! decl.is_function? then
    4075           next   # 既にエラー
     3848          next   # 既にエラー
    40763849        end
    40773850        paramdecl = decl.get_type.get_paramlist.find( ai[2] )
     
    40903863      end
    40913864
    4092       # 重複指定がないか?
     3865      # 重複指定がないか?
    40933866      if @allocator_instance[ "#{@name}_#{ai[1]}_#{ai[2]}" ] then
    40943867        cdl_error( "S1085 duplicate allocator specifier for \'$1_$2\'" , ai[1], ai[2] )
    40953868      end
    40963869
    4097       # 右辺のチェック
     3870      # 右辺のチェック
    40983871      case alloc_type
    40993872      when :INTERNAL_ALLOC
     
    41053878        end
    41063879
    4107         ep_name = ele[1]   # アロケータ受け口名
     3880        ep_name = ele[1]   # アロケータ受け口名
    41083881        ep = @owner.find ep_name.get_path[0]  # mikan "a::b"
    41093882        if ep == nil || ! ep.instance_of?( Port ) || ep.get_port_type != :ENTRY || ! ep.get_signature.is_allocator? then
    41103883          cdl_error( "S1175 $1 not found or not allocator entry port for $2" , ep_name, ai[1] )
    41113884        end
    4112         # 右辺チェック終わり
     3885        # 右辺チェック終わり
    41133886        # ai2 = [ :INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
    41143887        ai2 = [ ai[0], ai[1], ai[2], ep_name ]
     
    41223895          #    ele[0]    ele[1][0]  ele[1][1][0]  ele[1][1][1]        ele[1][2]    ele[2]
    41233896          #      name_space_path.Token(1).Token(2) === call_port.func.param
    4124           #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
     3897          #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
    41253898
    41263899          cdl_error( "S1176 rhs not in 'call_port.func.param' form for for $1_$2" , ai[1], ai[2] )   # S1086
     
    41283901        end
    41293902        func_name = ele[1][2]; cp_name = ele[1][1][1].get_name; param_name = ele[2].to_sym
    4130         cp = @owner.find cp_name    # リレーするå
    4131 ˆã®å‘¼ã³å£
     3903        cp = @owner.find cp_name    # リレーする先の呼び口
    41323904        if cp then
    4133 # mikan cp が呼び口であることのチェック(属性の場合もある)
    4134 # mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事é 
    4135 ï¼ˆå‘¼ã³å£å´ã§ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ãŒæ±ºå®šã•ã‚Œã‚‹ï¼‰
     3905# mikan cp が呼び口であることのチェック(属性の場合もある)
     3906# mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事項(呼び口側でアロケータが決定される)
    41363907          sig = cp.get_signature
    41373908          if sig && @signature then
     
    41433914            decl = fh.get_declarator
    41443915            if ! decl.is_function? then
    4145               next   # 既にエラー
     3916              next   # 既にエラー
    41463917            end
    41473918            paramdecl = decl.get_type.get_paramlist.find( param_name )
     
    41623933
    41633934            # else
    4164             # sig == nil ならば既にエラー
     3935            # sig == nil ならば既にエラー
    41653936          end
    41663937        else
     
    41733944          next
    41743945        end
    4175         # 右辺チェック終わり
     3946        # 右辺チェック終わり
    41763947        # ai2 = [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]
    41773948        ai2 = [ ai[0], ai[1], ai[2], cp_name, func_name, param_name ]
     
    41863957  end
    41873958
    4188   def is_VMT_useless?                     # VMT 関数テーブルを使用しない
     3959  def is_VMT_useless?                     # VMT 関数テーブルを使用しない
    41893960   @b_VMT_useless
    41903961  end
    41913962
    4192   def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3963  def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    41933964    @b_skelton_useless
    41943965  end
    41953966
    4196   def is_cell_unique?                     # 呼びå
    4197 ˆã®ã‚»ãƒ«ã¯ä¸€ã¤ï¼Ÿ
     3967  def is_cell_unique?                     # 呼び先のセルは一つ?
    41983968    @b_cell_unique
    41993969  end
    42003970
    4201   #=== Port# 受け口最適化の設定
    4202   # この受け口を参ç
    4203 §ã™ã‚‹å‘¼ã³å£ãŒ VMT, skelton をå¿
    4204 è¦ã¨ã—ているかどうかを設定
    4205   # 一つでも呼び口がå¿
    4206 è¦ã¨ã—ている(すなわち b_*_useless が false)場合は、
    4207   # この受け口の最適化を false とする
     3971  #=== Port# 受け口最適化の設定
     3972  # この受け口を参照する呼び口が VMT, skelton を必要としているかどうかを設定
     3973  # 一つでも呼び口が必要としている(すなわち b_*_useless が false)場合は、
     3974  # この受け口の最適化を false とする
    42083975  def set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    42093976    if ! b_VMT_useless then
     
    42153982  end
    42163983
    4217   #=== Port# 唯一の結合å
    4218 ˆã‚’設定
    4219   # 最適化で使用
    4220   #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
    4221   #  optional の場合 callee_cell, callee_port が nil となる
     3984  #=== Port# 唯一の結合先を設定
     3985  # 最適化で使用
     3986  #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
     3987  #  optional の場合 callee_cell, callee_port が nil となる
    42223988  def set_only_callee( callee_port, callee_cell )
    42233989    @only_callee_port = callee_port
     
    42253991  end
    42263992
    4227   #=== Port# 唯一の結合å
    4228 ˆãƒãƒ¼ãƒˆã‚’返す(compositeの場合実セル)
    4229   # optional 呼び口で未結合の場合 nil を返す
     3993  #=== Port# 唯一の結合先ポートを返す(compositeの場合実セル)
     3994  # optional 呼び口で未結合の場合 nil を返す
    42303995  def get_real_callee_port
    42313996    if @only_callee_cell then
     
    42343999  end
    42354000
    4236   #=== Port# 唯一の結合å
    4237 ˆã‚»ãƒ«ã‚’返す(compositeの場合実セル)
    4238   # optional 呼び口で未結合の場合 nil を返す
     4001  #=== Port# 唯一の結合先セルを返す(compositeの場合実セル)
     4002  # optional 呼び口で未結合の場合 nil を返す
    42394003  def get_real_callee_cell
    42404004    if @only_callee_cell then
     
    42514015  end
    42524016
    4253   #=== Port# 逆require の結合を生成する
     4017  #=== Port# 逆require の結合を生成する
    42544018  # STAGE: S
    42554019  def create_reverse_require_join cell
     
    42584022    end
    42594023
    4260     # 呼びå
    4261 ƒã‚»ãƒ«ã‚’探す
     4024    # 呼び元セルを探す
    42624025    ct_or_cell = Namespace.find( @reverse_require_cell_path )   # mikan namespace    #1
    42634026    if ct_or_cell.instance_of? Cell then
     
    42654028      ct = cell2.get_celltype
    42664029      if ct == nil then
    4267         return    # 既にエラー
     4030        return    # 既にエラー
    42684031      end
    42694032    elsif ct_or_cell.instance_of? Celltype then
     
    42754038      ct = ct_or_cell
    42764039    else
    4277       # 既にエラー:無視
     4040      # 既にエラー:無視
    42784041      return
    42794042    end
    42804043
    4281     # 結合を生成する
     4044    # 結合を生成する
    42824045    dbgPrint "create_reverse_require_join #{cell2.get_name}.#{@reverse_require_entry_port_name}[] = #{cell.get_name}.#{@name}"
    42834046    nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    42914054  end
    42924055
    4293   #=== Port# signature のすべての関数のすべてのパラメータをたどる
    4294   #block:: ブロックを引数として取る(ruby の文法で書かない)
    4295   #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
    4296   # Signature クラスにも each_param がある(同じ働き)
    4297   def each_param # ブロック引数{  |port, func_decl, param_decl| }
    4298     return if @signature == nil                         # signature 未定義(既にエラー)
    4299     fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数é
    4300 åˆ—
    4301     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    4302 
    4303     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4304 ¥
     4056  #=== Port# signature のすべての関数のすべてのパラメータをたどる
     4057  #block:: ブロックを引数として取る(ruby の文法で書かない)
     4058  #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
     4059  # Signature クラスにも each_param がある(同じ働き)
     4060  def each_param # ブロック引数{  |port, func_decl, param_decl| }
     4061    return if @signature == nil                         # signature 未定義(既にエラー)
     4062    fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数配列
     4063    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     4064
     4065    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    43054066    port = self
    4306     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    4307 åˆ—中の各関数頭部
    4308       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    4309       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    4310         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     4067    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     4068      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     4069      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     4070        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    43114071          pr.call( port, fd, par )
    43124072        }
     
    43154075  end
    43164076
    4317   #=== Port# 逆require指定されている?
     4077  #=== Port# 逆require指定されている?
    43184078  def is_reverse_required?
    43194079    @reverse_require_cell_path != nil
     
    43574117#== Namespace
    43584118#
    4359 # root namespace だけ、Region クラスのインスタンスとして生成される
    4360 # root namespace は、root region をå
    4361 ¼ã­ã‚‹ãŸã‚
     4119# root namespace だけ、Region クラスのインスタンスとして生成される
     4120# root namespace は、root region を兼ねるため
    43624121#
    4363 # @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
     4122# @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
    43644123#
    43654124class Namespace < NSBDNode
    4366 # @name::  Symbol     # root の場合 "::" (String)
     4125# @name::  Symbol     # root の場合 "::" (String)
    43674126# @global_name:: str
    43684127# @name_list:: NamedList   Signature,Celltype,CompositeCelltype,Cell,Typedef,Namespace
    43694128# @struct_tag_list:: NamedList : StructType
    4370 # @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
     4129# @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
    43714130# @signature_list:: Sginature[]
    43724131# @celltype_list:: Celltype[]
     
    43744133# @cell_list:: Cell[]
    43754134# @typedef_list:: Typedef[]
    4376 # @decl_list:: ( Typedef | StructType | EnumType )[]   ä¾å­˜é–¢ä¿‚がある場合に備えて、順番どおりにé
    4377 åˆ—に格納 mikan enum
     4135# @decl_list:: ( Typedef | StructType | EnumType )[]   依存関係がある場合に備えて、順番どおりに配列に格納 mikan enum
    43784136# @const_decl_list:: Decl[]
    4379 # @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
    4380 # @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
    4381 
    4382   # mikan namespace の push, pop
    4383 
    4384   # namespace 階層用のスタック
     4137# @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
     4138# @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
     4139
     4140  # mikan namespace push, pop
     4141
     4142  # namespace 階層用のスタック
    43854143  @@namespace_stack = []      # @@namespace_stack[0] = "::" (generator.rb)
    43864144  @@namespace_sp = -1
    43874145
    4388   # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
     4146  # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
    43894147  @@nest_stack_index = -1
    43904148  @@nest_stack = []
     
    43924150  @@root_namespace = nil
    43934151
    4394   # Generator ネスト用スタックの push, pop (クラスメソッド)
     4152  # Generator ネスト用スタックの push, pop (クラスメソッド)
    43954153  def self.push
    43964154    dbgPrint "push Namespace\n"
     
    44124170  end
    44134171
    4414   # namespace 階層用スタックの push, pop (インスタンスメソッド)
     4172  # namespace 階層用スタックの push, pop (インスタンスメソッド)
    44154173  def push ns
    44164174    @@namespace_sp += 1
     
    44344192    if( name == "::" )then
    44354193      if( @@root_namespace != nil )then
    4436         # root は一回のみ生成できる
     4194        # root は一回のみ生成できる
    44374195        raise "try to re-create root namespace"
    44384196      end
     
    44434201      if ns.kind_of? Namespace then
    44444202        dbgPrint "namespace: re-appear #{@name}\n"
    4445         # 登録済み namespace の再登録
     4203        # 登録済み namespace の再登録
    44464204        ns.push ns
    44474205        return
     
    44544212    end
    44554213
    4456     if @@namespace_sp >= 0 then   # root は除外
     4214    if @@namespace_sp >= 0 then   # root は除外
    44574215      @@namespace_stack[@@namespace_sp].new_namespace( self )
    44584216    end
    44594217    push self
    44604218
    4461     @global_name = Namespace.get_global_name    # stack 登録後取る
     4219    @global_name = Namespace.get_global_name    # stack 登録後取る
    44624220    @name_list = NamedList.new( nil, "symbol in namespace '#{@name}'" )
    44634221    @struct_tag_list = NamedList.new( nil, "struct tag" )
     
    44744232    @cache_generating_region = nil
    44754233    if @NamespacePath == nil then
    4476       # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
    4477       set_namespace_path # @NamespacePath の設定
     4234      # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
     4235      set_namespace_path # @NamespacePath の設定
    44784236    end
    44794237  end
     
    44874245  end
    44884246
    4489   #=== Namespace:: global_name を得る
    4490   # parse 中のみこのメソッドは使える
     4247  #=== Namespace:: global_name を得る
     4248  # parse 中のみこのメソッドは使える
    44914249  # STAGE: P
    4492   def self.get_global_name    # parse 中有効
     4250  def self.get_global_name    # parse 中有効
    44934251    if @@namespace_sp <= 0 then
    44944252      return ""
     
    45094267  end
    45104268
    4511   #=== Namespace#セルの個数を得る
    4512   # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
    4513   # プロトタイプ宣言のもののみの個数を含めない
    4514   # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
    4515   # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
     4269  #=== Namespace#セルの個数を得る
     4270  # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
     4271  # プロトタイプ宣言のもののみの個数を含めない
     4272  # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
     4273  # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
    45164274  def get_n_cells
    45174275    if @cache_generating_region == $generating_region then
    4518       # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
     4276      # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
    45194277      return @cache_n_cells
    45204278    end
     
    45224280    count = 0
    45234281    @cell_list.each{ |c|
    4524       # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
     4282      # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
    45254283      if c.get_f_def == true then
    45264284        # print "get_n_cells: cell: #{c.get_name}\n"
     
    45334291        count += ns.get_n_cells
    45344292      else
    4535         # ns は Region である
     4293        # ns は Region である
    45364294        rt = ns.get_region_type
    45374295        # print "get_n_cells: region: #{ns.get_name}: #{rt}\n"
    45384296        if rt == :NODE || rt == :LINKUNIT then
    4539           # 別の linkunit なので加算しない
     4297          # 別の linkunit なので加算しない
    45404298        else
    45414299          count += ns.get_n_cells
     
    45494307  end
    45504308
    4551   #=== Namespace.find : in_path で示されるオブジェクトを探す
     4309  #=== Namespace.find : in_path で示されるオブジェクトを探す
    45524310  #in_path:: NamespacePath
    4553   #in_path:: Array : 古い形式
     4311  #in_path:: Array : 古い形式
    45544312  #  path [ "::", "ns1", "ns2" ]   absolute
    45554313  #  path [ "ns1", "ns2" ]         relative
     
    45664324      if name == "::" then
    45674325        i = 1
    4568         name = path[i]   # 構文的にå¿
    4569 ãšå­˜åœ¨
     4326        name = path[i]   # 構文的に必ず存在
    45704327        object = @@root_namespace.find( name )  # root
    45714328      else
    4572         # 相対パス
     4329        # 相対パス
    45734330        i = 0
    45744331        object = @@namespace_stack[@@namespace_sp].find_one( name ) # crrent
     
    46034360
    46044361      unless object.kind_of?( Namespace ) then
    4605         # クラスメソッドå†
    4606 ã§ cdl_error を呼び出すことはできない
    4607         # また、前方参ç
    4608 §å¯¾å¿œå¾Œã€æ­£ç¢ºãªè¡Œç•ªå·ãŒå‡ºãªã„問題も生じる
     4362        # クラスメソッド内で cdl_error を呼び出すことはできない
     4363        # また、前方参照対応後、正確な行番号が出ない問題も生じる
    46094364        # cdl_error( "S1092 \'$1\' not namespace" , name )
    4610         # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
     4365        # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
    46114366        return nil
    46124367      end
     
    46244379  end
    46254380
    4626   #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
     4381  #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
    46274382  def self.find_one( name )
    46284383    return @@namespace_stack[@@namespace_sp].find_one( name )
     
    46324387
    46334388    object = find( name )
    4634     # これは出すぎ
     4389    # これは出すぎ
    46354390    # dbgPrint "in '#{@name}' find '#{name}' object #{object ? object.class : "Not found"}\n"
    46364391
     
    46494404
    46504405  def self.find_tag( name )
    4651     # mikan tag : namespace の path に対応しない
    4652     # namespace の中にあっても、root namespace にあるものと見なされる
    4653     # よって カレント namespace から根に向かって探す
     4406    # mikan tag : namespace の path に対応しない
     4407    # namespace の中にあっても、root namespace にあるものと見なされる
     4408    # よって カレント namespace から根に向かって探す
    46544409    i = @@namespace_sp
    46554410    while i >= 0
     
    47274482  end
    47284483
    4729   #=== Namespace# 参ç
    4730 §ã•ã‚Œã¦ã„るが、未定義のセルを探す
    4731   # プロトタイプ宣言だけで定義されていないケースをエラーとする
    4732   # 受動の未結合セルについて警告する
     4484  #=== Namespace# 参照されているが、未定義のセルを探す
     4485  # プロトタイプ宣言だけで定義されていないケースをエラーとする
     4486  # 受動の未結合セルについて警告する
    47334487  def check_ref_but_undef
    47344488    @cell_list.each { |c|
    4735       if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
     4489      if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
    47364490        if c.get_f_ref then
    47374491          cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
     
    47534507  end
    47544508
    4755   #=== Namespace# セルの受け口の参ç
    4756 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
     4509  #=== Namespace# セルの受け口の参照カウントを設定する
    47574510  def set_port_reference_count
    47584511    @cell_list.each { |c|
     
    47704523
    47714524  def new_structtype( struct )
    4772     # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
     4525    # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
    47734526    dup = @struct_tag_list.get_item(struct.get_name)
    47744527    if dup != nil then
    47754528      if struct.same? dup then
    4776         # 同じものが typedef された
     4529        # 同じものが typedef された
    47774530        # p "#{struct.get_name}"
    47784531        return
     
    47984551      if typedef_type.get_type_str == dup_type.get_type_str &&
    47994552          typedef_type.get_type_str_post == dup_type.get_type_str_post then
    4800         # 同じものが typedef された
    4801         # ここへ来るのは C で関数ポインタを typedef しているケース
    4802         # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
     4553        # 同じものが typedef された
     4554        # ここへ来るのは C で関数ポインタを typedef しているケース
     4555        # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
    48034556        #    typedef long LONG;
    48044557        #    typedef long LONG;
    4805         # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
     4558        # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
    48064559        # p "#{typedef.get_declarator.get_type.get_type_str} #{typedef.get_name} #{typedef.get_declarator.get_type.get_type_str_post}"
    48074560        return
     
    48444597  def new_const_decl( decl )
    48454598    decl.set_owner self   # Decl (Namespace:const)
    4846     if ! decl.is_const? then                    # const 修飾さていること
     4599    if ! decl.is_const? then                    # const 修飾さていること
    48474600      if decl.is_type?( PtrType ) then
    48484601        cdl_error( "S1094 $1: pointer is not constant. check \'const\'" , decl.get_name )
     
    48524605    elsif ! decl.is_type?( IntType ) && ! decl.is_type?( FloatType ) &&
    48534606        ! decl.is_type?( BoolType ) && ! decl.is_type?( PtrType ) then
    4854                                             # IntType, FloatType であること
     4607                                            # IntType, FloatType であること
    48554608      cdl_error( "S1096 $1: should be int, float, bool or pointer type" , decl.get_name )
    4856     elsif decl.get_initializer == nil then   # 初期値を持つこと
     4609    elsif decl.get_initializer == nil then   # 初期値を持つこと
    48574610      cdl_error( "S1097 $1: has no initializer" , decl.get_name )
    4858 #    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
    4859 #                                            # mikan 初期値が型に対し適切であること
     4611#    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
     4612#                                            # mikan 初期値が型に対し適切であること
    48604613#      cdl_error( "S1098 $1: has unsuitable initializer" , decl.get_name )
    48614614    else
     
    48794632 ###
    48804633
    4881   #=== Namespace# すべてのセルの require ポートを設定
     4634  #=== Namespace# すべてのセルの require ポートを設定
    48824635  # STAGE: S
    48834636  def set_require_join
     
    48854638      ct.set_require_join
    48864639    }
    4887     # すべての namespace について require ポートをセット
     4640    # すべての namespace について require ポートをセット
    48884641    @namespace_list.each{ |ns|
    48894642      ns.set_require_join
     
    48914644  end
    48924645
    4893   #=== Namespace# Join への definition の設定とチェック
    4894   # セルタイプに属するすべてのセルに対して実施
     4646  #=== Namespace# Join への definition の設定とチェック
     4647  # セルタイプに属するすべてのセルに対して実施
    48954648  def set_definition_join
    4896     # celltype のコードを生成
     4649    # celltype のコードを生成
    48974650    @cell_list.each { |c|
    48984651      dbgPrint "set_definition_join #{c.get_name}\n"
     
    49044657  end
    49054658
    4906   #=== Namespace# セルの結合をチェックする
     4659  #=== Namespace# セルの結合をチェックする
    49074660  def check_join
    49084661    @cell_list.each { |c|
     
    49164669  end
    49174670
    4918   #== Namespace# ルートか?
    4919   # ルートネームスペース と ルートリージョンは同じ
     4671  #== Namespace# ルートか?
     4672  # ルートネームスペース と ルートリージョンは同じ
    49204673  def is_root?
    49214674    @name == "::"
    49224675  end
    49234676
    4924   #== Namespace# ルートを得る
    4925   # ルートリージョンとルートネームスペースは同じオブジェクト
     4677  #== Namespace# ルートを得る
     4678  # ルートリージョンとルートネームスペースは同じオブジェクト
    49264679  def self.get_root
    49274680    @@root_namespace
     
    49454698#
    49464699# available if definition is Port
    4947 # @cell_name:: string : 右辺のセルの名前
    4948 # @cell:: Cell  : 右辺のセル
    4949 # @celltype:: Celltype : 右辺のセルタイプ
    4950 # @port_name:: string : 右辺の受け口名
    4951 # @port:: Port : 右辺の受け口
     4700# @cell_name:: string : 右辺のセルの名前
     4701# @cell:: Cell  : 右辺のセル
     4702# @celltype:: Celltype : 右辺のセルタイプ
     4703# @port_name:: string : 右辺の受け口名
     4704# @port:: Port : 右辺の受け口
    49524705# @array_member:: rhs array : available only for first appear in the same name
    49534706# @array_member2:: Join array : available only for first appear in the same name
    4954 # @rhs_subscript:: nil : not array, >=0: 右辺の添数
     4707# @rhs_subscript:: nil : not array, >=0: 右辺の添数
    49554708#
    49564709
    49574710# @through_list::  @cp_through_list + @region_through_list
    4958 #  以下の構造を持つ(@cp_through_list の構造はå
    4959 ±é€šï¼‰
    4960 # @cp_through_list::  呼び口に指定された through
     4711#  以下の構造を持つ(@cp_through_list の構造は共通)
     4712# @cp_through_list::  呼び口に指定された through
    49614713#   [ [plugin_name, cell_name, plugin_arg], [plugin_name2, cell_name2, plugin_arg], ... ]
    4962 # @region_through_list::  region に指定された through
     4714# @region_through_list::  region に指定された through
    49634715#   [ [plugin_name, cell_name, plugin_arg, region], [plugin_name2, cell_name2, plugin_arg, region2], ... ]
    49644716#
    4965 # @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
    4966 # @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
     4717# @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
     4718# @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
    49674719#
    49684720
    49694721  include PluginModule
    49704722
    4971   #=== Join# 初期化
    4972   #name:: string: 名前(属性名、呼び口名)
    4973   #subscript:: Nil=非é
    4974 åˆ—, -1="[]", N="[N]"
    4975   #rhs:: Expression: 右辺の式
     4723  #=== Join# 初期化
     4724  #name:: string: 名前(属性名、呼び口名)
     4725  #subscript:: Nil=非配列, -1="[]", N="[N]"
     4726  #rhs:: Expression: 右辺の式
    49764727  def initialize( name, subscript, rhs, locale = nil )
    49774728    # dbgPrint "Join#new: #{name}, #{subscript} #{rhs.eval_const(nil)}\n"
     
    49854736    @name = name
    49864737    if subscript.instance_of?( Expression ) then
    4987        #mikan é
    4988 åˆ—添数が整数であることを未チェック
     4738       #mikan 配列添数が整数であることを未チェック
    49894739       @subscript = subscript.eval_const(nil)
    49904740       if @subscript == nil then
     
    49984748    @definition = nil
    49994749
    5000     # é
    5001 åˆ—要素を設定
    5002     # 本当は、初出の要素のみ設定するのが適当
    5003     # new_join で add_array_member の中で初出要素の array_member に対し設定する
     4750    # 配列要素を設定
     4751    # 本当は、初出の要素のみ設定するのが適当
     4752    # new_join で add_array_member の中で初出要素の array_member に対し設定する
    50044753    if @subscript == -1 then
    50054754      @array_member  = [self]
     
    50194768  end
    50204769
    5021   #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
     4770  #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
    50224771  # STAGE:   S
    50234772  #
    5024   #     ä»£å
    5025 ¥å¯èƒ½ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹
    5026   #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
     4773  #     代入可能かチェックする
     4774  #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
    50274775
    50284776  def set_definition( definition )
     
    50304778    dbgPrint "set_definition: #{@owner.get_name}.#{@name} = #{definition.class}\n"
    50314779
    5032     # 二重チェックの防止
     4780    # 二重チェックの防止
    50334781    if @definition then
    5034       # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
    5035       # 二重に set_definition が実行されると through が二重に適用されてしまう
     4782      # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
     4783      # 二重に set_definition が実行されると through が二重に適用されてしまう
    50364784      # cdl_warning( "W9999 $1, internal error: set_definition duplicate", @name )
    50374785      return
     
    50404788    @definition = definition
    50414789
    5042     # mikan 左辺値、右辺値の型チェックなど
     4790    # mikan 左辺値、右辺値の型チェックなど
    50434791    if @definition.instance_of?( Decl ) then
    50444792      check_var_init
    50454793    elsif @definition.instance_of?( Port ) then
    50464794      check_call_port_init
    5047       if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
     4795      if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
    50484796        check_and_gen_through
    5049         create_allocator_join  # through プラグイン生成した後でないと、挿å
    5050 ¥å‰ã®ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’結合してしまう
     4797        create_allocator_join  # through プラグイン生成した後でないと、挿入前のセルのアロケータを結合してしまう
    50514798      end
    50524799    elsif @definition == nil then
     
    50574804  end
    50584805
    5059   #=== Join# 変数の初期化チェック
     4806  #=== Join# 変数の初期化チェック
    50604807  def check_var_init
    5061     # attribute, var の場合
     4808    # attribute, var の場合
    50624809    if @definition.get_kind == :ATTRIBUTE then
    50634810#        check_cell_cb_init( definition.get_type, @rhs )
    5064       # 右辺で初期化可能かチェック
     4811      # 右辺で初期化可能かチェック
    50654812      @definition.get_type.check_init( @locale, @definition.get_identifier, @rhs, :ATTRIBUTE )
    50664813    elsif @definition.get_kind == :VAR then
    5067       # var は初期化できない
     4814      # var は初期化できない
    50684815      cdl_error( "S1100 $1: cannot initialize var" , @name )
    50694816    else
     
    50734820  end
    50744821
    5075   #=== Join# 呼び口の初期化チェック
     4822  #=== Join# 呼び口の初期化チェック
    50764823  def check_call_port_init
    50774824    ### Port
    50784825
    5079     # 左辺は受け口か(受け口を初期化しようとしている)?
     4826    # 左辺は受け口か(受け口を初期化しようとしている)?
    50804827    if @definition.get_port_type == :ENTRY then
    50814828      cdl_error( "S1101 \'$1\' cannot initialize entry port" , @name )
     
    50834830    end
    50844831
    5085 #      # é
    5086 åˆ—添数の整合性チェック
    5087 #      # 呼び口の定義で、非é
    5088 åˆ—なら添数なし、添数なしé
    5089 åˆ—なら添数なし、添数ありé
    5090 åˆ—なら添数あり
     4832#      # 配列添数の整合性チェック
     4833#      # 呼び口の定義で、非配列なら添数なし、添数なし配列なら添数なし、添数あり配列なら添数あり
    50914834    as = @definition.get_array_size
    50924835    if ( @subscript == nil && as != nil ) then
     
    51114854#    end
    51124855
    5113     # mikan Expression の get_type で型導出させる方がスマート
    5114     # mikan '=' の左辺がé
    5115 åˆ—かどうか未チェック
    5116     #(1) '=' の右辺は "Cell.ePort" の形式か?
    5117     #     æ¼”算子は "."  かつ "." の左辺が :IDENTIFIER
    5118     #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
    5119     #(2) "Cell" は存在するか?(名前が一致するものはあるか)
    5120     #(3) "Cell" は cell か?
    5121     #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
    5122     #(5) "ePort" は "Cell" の celltype å†
    5123 ã«å­˜åœ¨ã™ã‚‹ã‹ï¼Ÿ
    5124     #(6) "ePort" は entry port か?
    5125     #(7) signature は一致するか
    5126 
    5127     # 右辺がない(以前の段階でエラー)
     4856    # mikan Expression の get_type で型導出させる方がスマート
     4857    # mikan '=' の左辺が配列かどうか未チェック
     4858    #(1) '=' の右辺は "Cell.ePort" の形式か?
     4859    #     演算子は "."  かつ "." の左辺が :IDENTIFIER
     4860    #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
     4861    #(2) "Cell" は存在するか?(名前が一致するものはあるか)
     4862    #(3) "Cell" は cell か?
     4863    #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
     4864    #(5) "ePort" は "Cell" の celltype 内に存在するか?
     4865    #(6) "ePort" は entry port か?
     4866    #(7) signature は一致するか
     4867
     4868    # 右辺がない(以前の段階でエラー)
    51284869    return unless @rhs
    51294870
    5130     # cCall = composite.cCall; のチェック.この形式は属性用
    5131     # 呼び口を export するには cCall => composite.cCall; の形式を用いる
     4871    # cCall = composite.cCall; のチェック.この形式は属性用
     4872    # 呼び口を export するには cCall => composite.cCall; の形式を用いる
    51324873    if @rhs.instance_of?( Array ) == true && @rhs[0] == :COMPOSITE then
    51334874      cdl_error( "S1107 to export port, use \'cCall => composite.cCall\'"  )
     
    51374878    end
    51384879
    5139     # 右辺の Expression の要素を取り出す
     4880    # 右辺の Expression の要素を取り出す
    51404881    ret = @rhs.analyze_cell_join_expression
    51414882    if ret == nil then   #1
     
    51454886
    51464887    nsp, @rhs_subscript, @port_name = ret[0], ret[1], ret[2]
    5147     @cell_name = nsp.get_name     # mikan ns::cellname の形式の考æ
    5148 ®
    5149 
    5150     # composite の定義の中なら object は結合å
    5151 ˆ cell か、見つからなければ nil が返る
    5152     # composite の定義外なら false が返る
     4888    @cell_name = nsp.get_name     # mikan ns::cellname の形式の考慮
     4889
     4890    # composite の定義の中なら object は結合先 cell か、見つからなければ nil が返る
     4891    # composite の定義外なら false が返る
    51534892    object = CompositeCelltype.find( @cell_name )
    51544893    if object == false then
    5155 #     mikan 左辺が namespace に対応していないため。 path にして find
     4894#     mikan 左辺が namespace に対応していないため。 path にして find
    51564895      # p nsp.get_path_str, nsp.get_path
    51574896      object = Namespace.find( nsp )    #1
     
    51724911      object.set_f_ref
    51734912
    5174       # 右辺のセルのセルタイプ
     4913      # 右辺のセルのセルタイプ
    51754914      celltype = object.get_celltype
    51764915
     
    51854924          cdl_error( "S1113 \'$1\' signature mismatch" , @port_name )
    51864925        elsif object2.get_array_size then
    5187           # 受け口é
    5188 åˆ—
     4926          # 受け口配列
    51894927
    51904928          unless @rhs_subscript then
    5191             # 右辺に添数指定がなかった
     4929            # 右辺に添数指定がなかった
    51924930            cdl_error( "S1114 \'$1\' should be array" , @port_name )
    51934931          else
     
    51954933            as = object2.get_array_size
    51964934            if( as.kind_of?( Integer ) && as <= @rhs_subscript )then
    5197               # 受け口é
    5198 åˆ—の大きさに対し、右辺の添数が同じか大きい
     4935              # 受け口配列の大きさに対し、右辺の添数が同じか大きい
    51994936              cdl_error( "S1115 $1[$2]: subscript out of range (< $3)" , @port_name, @rhs_subscript, as )
    52004937            else
     
    52034940              @celltype = celltype
    52044941              @port = object2
    5205               # 右辺のセルの受け口 object2 を参ç
    5206 §æ¸ˆã¿ã«ã™ã‚‹
     4942              # 右辺のセルの受け口 object2 を参照済みにする
    52074943              # object2: Port, @definition: Port
    52084944              @cell.set_entry_port_max_subscript( @port, @rhs_subscript )
     
    52144950          end
    52154951        elsif @rhs_subscript then
    5216           # 受け口é
    5217 åˆ—でないのに右辺で添数指定されている
     4952          # 受け口配列でないのに右辺で添数指定されている
    52184953          cdl_error( "S1116 \'$1\' entry port is not array" , @port_name )
    52194954        else
     
    52234958          @celltype = celltype
    52244959
    5225           # 右辺のセル object の受け口 object2 を参ç
    5226 §æ¸ˆã¿ã«ã™ã‚‹
     4960          # 右辺のセル object の受け口 object2 を参照済みにする
    52274961          # object2: Port, @definition: Port
    52284962
    52294963          # debug
    52304964          # p "rhs:  #{@cell}  #{@cell.get_name}"
    5231         end  # end of port (object2) チェック
     4965        end  # end of port (object2) チェック
    52324966
    52334967        #else
    5234         #  celltype == nil (すでにエラー)
    5235       end  # end of celltyep チェック
     4968        #  celltype == nil (すでにエラー)
     4969      end  # end of celltyep チェック
    52364970
    52374971
    52384972      check_region( object )
    52394973
    5240     end  # end of cell (object) チェック
    5241 
    5242   end
    5243 
    5244   #=== Join# アロケータの結合を生成
     4974    end  # end of cell (object) チェック
     4975
     4976  end
     4977
     4978  #=== Join# アロケータの結合を生成
    52454979  # STAGE: S
    5246   #cell::  呼び口の結合å
    5247 ˆã®ã‚»ãƒ«
     4980  #cell::  呼び口の結合先のセル
    52484981  #
    5249   # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
    5250   # 受け口側は Cell の set_specifier_list で生成
    5251   #  a[*] のå†
    5252 å®¹ã¯ Cell の set_specifier_list を参ç
    5253 §
     4982  # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
     4983  # 受け口側は Cell の set_specifier_list で生成
     4984  #  a[*] の内容は Cell の set_specifier_list を参照
    52544985  def create_allocator_join
    52554986
    5256     cell = get_rhs_cell2   # 右辺のセルを得る
     4987    cell = get_rhs_cell2   # 右辺のセルを得る
    52574988    port = get_rhs_port2
    52584989
    5259     if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
     4990    if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
    52604991
    52614992      dbgPrint "create_allocator_join: #{@owner.get_name}.#{@name}=>#{cell ? cell.get_name : "nil"}\n"
     
    52644995
    52654996        if( a[0+1] == port && a[1+1] == @rhs_subscript )then
    5266           # 名前の一致するものの結合を生成する
    5267           # 過不足は、別途チェックされる
     4997          # 名前の一致するものの結合を生成する
     4998          # 過不足は、別途チェックされる
    52684999          cp_name = :"#{@name}_#{a[2+1]}_#{a[3+1]}"
    52695000          # p "creating allocator join #{cp_name} #{@subscript} #{a[1+1]}"
     
    52805011  end
    52815012
    5282   #=== Join# リージョン間の結合をチェック
    5283   # リージョン間の through による @region_through_list の作成
    5284   # 実際の生成は check_and_gen_through で行う
    5285   # mikan Cell#distance とRegion へたどり着くまでための処理にå
    5286 ±é€šéƒ¨åˆ†ãŒå¤šã„
     5013  #=== Join# リージョン間の結合をチェック
     5014  # リージョン間の through による @region_through_list の作成
     5015  # 実際の生成は check_and_gen_through で行う
     5016  # mikan Cell#distance とRegion へたどり着くまでための処理に共通部分が多い
    52875017  def check_region( object )
    52885018
     
    52915021    # print "DOMAIN: check_region #{@owner.get_name}.#{@name} => #{object.get_name}\n"
    52925022
    5293     # プラグインで生成されたなかでは生成しない
    5294     # さもないとプラグイン生成されたものとの間で、無限に生成される
     5023    # プラグインで生成されたなかでは生成しない
     5024    # さもないとプラグイン生成されたものとの間で、無限に生成される
    52955025##    if Generator.get_nest >= 1 then
    5296 ##    if Generator.get_plugin then     # mikan これはå¿
    5297 è¦ï¼Ÿ (意味解析段階での実行になるので不適切)
     5026##    if Generator.get_plugin then     # mikan これは必要? (意味解析段階での実行になるので不適切)
    52985027    if @owner.get_plugin.kind_of?( ThroughPlugin ) then
    5299       # プラグイン生成されたセルの場合、結合チェックのみ
     5028      # プラグイン生成されたセルの場合、結合チェックのみ
    53005029      return
    53015030    end
    53025031
    5303     # region のチェック
    5304     r1 = @owner.get_region      # 呼び口セルの region
    5305     r2 = object.get_region      # 受け口セルの region
    5306 
    5307     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     5032    # region のチェック
     5033    r1 = @owner.get_region      # 呼び口セルの region
     5034    r2 = object.get_region      # 受け口セルの region
     5035
     5036    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    53085037
    53095038      f1 = r1.get_family_line
     
    53125041      len2 = f2.length
    53135042
    5314       # 不一致になるところ(å
    5315 „弟)を探す
    5316       i = 1  # i = 0 は :RootRegion なのでå¿
    5317 ãšä¸€è‡´
     5043      # 不一致になるところ(兄弟)を探す
     5044      i = 1  # i = 0 は :RootRegion なので必ず一致
    53185045      while( i < len1 && i < len2 )
    53195046        if( f1[i] != f2[i] )then
     
    53235050      end
    53245051
    5325       sibling_level = i     # å
    5326 „弟となるレベル、もしくはどちらか一方が終わったレベル
     5052      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    53275053
    53285054      dbgPrint "sibling_level: #{i}\n"
     
    53375063
    53385064
    5339       # 呼び側について呼びå
    5340 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    5341 „弟レベルまで(out_through をチェックおよび挿å
    5342 ¥ï¼‰
     5065      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    53435066      i = len1 -1
    53445067      if b_to_through then
     
    53645087
    53655088        out_through_list.each { |ol|
    5366           if ol[0] then    # plugin_name が指定されていなければ登録しない
     5089          if ol[0] then    # plugin_name が指定されていなければ登録しない
    53675090            plugin_arg = CDLString.remove_dquote ol[1]
    53685091            through = [ ol[0], :"Join_out_through_", plugin_arg, f1[i], f1[i-1], :OUT_THROUGH, region_count]
     
    53775100      end
    53785101
    5379       # å
    5380 „弟レベルにおいて(to_through をチェックおよび挿å
    5381 ¥ï¼‰
     5102      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    53825103      if f1[sibling_level] && f2[sibling_level] then
    53835104        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
    53845105        found = 0
    5385         region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
     5106        region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
    53865107        f1[sibling_level].get_to_through_list.each { |t|
    5387           if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    5388             if t[1] then    # plugin_name が指定されていなければ登録しない
     5108          if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     5109            if t[1] then    # plugin_name が指定されていなければ登録しない
    53895110              plugin_arg = CDLString.remove_dquote t[2]
    53905111              through = [ t[1], :"Join_to_through__", plugin_arg, f1[sibling_level], f2[sibling_level], :TO_THROUGH, region_count ]
     
    54095130      end
    54105131
    5411       # 受け側についてå
    5412 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    5413 ¥ï¼‰
     5132      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    54145133      if b_to_through then
    5415         i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
     5134        i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
    54165135      else
    54175136        i = sibling_level
     
    54365155        end
    54375156        in_through_list.each { |il|
    5438           if il[0] then    # plugin_name が指定されていなければ登録しない
     5157          if il[0] then    # plugin_name が指定されていなければ登録しない
    54395158            plugin_arg = CDLString.remove_dquote il[1]
    54405159            through = [ il[0], :"Join_in_through_", plugin_arg, f2[i-1], f2[i],:IN_THROUGH, region_count ]
     
    54495168
    54505169
    5451   #=== Join# 生成しないリージョンへの結合かチェック
    5452   # 右辺のセルが、生成されないリージョンにあればエラー
    5453   # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
     5170  #=== Join# 生成しないリージョンへの結合かチェック
     5171  # 右辺のセルが、生成されないリージョンにあればエラー
     5172  # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
    54545173  def check_region2
    54555174    lhs_cell = @owner
    54565175
    5457     # 生成しないリージョンのセルへの結合か?
     5176    # 生成しないリージョンのセルへの結合か?
    54585177    # if join.get_cell && ! join.get_cell.is_generate? then
    5459     # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
     5178    # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
    54605179    # print "Link root: (caller #{@owner.get_name}) '#{@owner.get_region.get_link_root.get_name}'"
    54615180    # print " #{@owner.get_region.get_link_root == get_rhs_region.get_link_root ? "==" : "!="} "
     
    54705189      end
    54715190    else
    5472       # rhs のセルが存在しなかった (既にエラー)
     5191      # rhs のセルが存在しなかった (既にエラー)
    54735192    end
    54745193  end
     
    54785197  end
    54795198
    5480   #=== Join# specifier を設定
     5199  #=== Join# specifier を設定
    54815200  # STAGE: B
    5482   # set_specifier_list は、join の解析の最後で呼び出される
    5483   # through 指定子を設定
    5484   #  check_and_gen_through を呼出して、through 生成
     5201  # set_specifier_list は、join の解析の最後で呼び出される
     5202  # through 指定子を設定
     5203  #  check_and_gen_through を呼出して、through 生成
    54855204  def set_specifier_list( specifier_list )
    54865205
     
    54905209        # set plugin_name
    54915210        plugin_name = s[1].to_s
    5492         plugin_name[0] = "#{plugin_name[/^./].upcase}"     # å
    5493 ˆé ­æ–‡å­—を大文字に : ruby のクラス名の制約
     5211        plugin_name[0] = "#{plugin_name[/^./].upcase}"     # 先頭文字を大文字に : ruby のクラス名の制約
    54945212
    54955213        # set cell_name
     
    54985216        # set plugin_arg
    54995217        plugin_arg = CDLString.remove_dquote s[2].to_s
    5500         # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
     5218        # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
    55015219        # plugin_arg.sub!( /(.*)"\z/, '\1' )
    55025220
     
    55075225  end
    55085226
    5509   #=== Join# through のチェックと生成
    5510   # new_join の中の check_region で region 間の through が @region_through に設定される
    5511   # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
    5512   # その後、このメソッドが呼ばれる
     5227  #=== Join# through のチェックと生成
     5228  # new_join の中の check_region で region 間の through が @region_through に設定される
     5229  # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
     5230  # その後、このメソッドが呼ばれる
    55135231  def check_and_gen_through
    55145232
     
    55315249
    55325250    @through_list = @cp_through_list + @region_through_list
    5533       # 後から @cp_through_list と @region_through_list に分けたため、このような実è£
    5534 ã«ãªã£ãŸ
     5251      # 後から @cp_through_list と @region_through_list に分けたため、このような実装になった
    55355252
    55365253    if @through_list then           # nil when the join is not Port
    5537       len = @through_list.length    # through が連接している数
     5254      len = @through_list.length    # through が連接している数
    55385255    else
    55395256      len = 0
     
    55465263    end
    55475264
    5548     # 連続した through について、受け口側から順にセルを生成し解釈する
     5265    # 連続した through について、受け口側から順にセルを生成し解釈する
    55495266    i = len - 1
    55505267    while i >= 0
     
    55755292
    55765293      else
    5577         # 最後のセルの場合、次のセルの名前、ポート名
     5294        # 最後のセルの場合、次のセルの名前、ポート名
    55785295        next_cell      = @cell
    55795296        next_port_name = @port_name
    55805297
    55815298        if next_cell == nil then
    5582           # 結合å
    5583 ˆãŒãªã„
     5299          # 結合先がない
    55845300          return
    55855301        end
     
    55875303
    55885304      if i >= cp_len then
    5589         # region_through_list 部分
    5590         # region から @cell_name.@port_name への through がないか探す
     5305        # region_through_list 部分
     5306        # region から @cell_name.@port_name への through がないか探す
    55915307        # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762
    55925308        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name )
    5593            # @through_list[i] と @region_through_list[i-cp_len] は同じ
    5594         # å
    5595 ±ç”¨ã—ないようにするには、見つからなかったことにすればよい
     5309           # @through_list[i] と @region_through_list[i-cp_len] は同じ
     5310        # 共用しないようにするには、見つからなかったことにすればよい
    55965311        # rp = nil
    55975312      else
    5598         # region 以外のものはå
    5599 ±æœ‰ã—ない
    5600         # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
     5313        # region 以外のものは共有しない
     5314        # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
    56015315        rp = nil
    56025316      end
     
    56075321        end
    56085322      else
    5609         # 見つかったものをå
    5610 ±ç”¨ã™ã‚‹
     5323        # 見つかったものを共用する
    56115324        @through_generated_list[ i ] = rp
    56125325      end
    56135326
    56145327      if i >= cp_len then
    5615         # @through_generated_list のうち @region_through_listに対応する部分
     5328        # @through_generated_list のうち @region_through_listに対応する部分
    56165329        @region_through_generated_list[ i - cp_len ] = @through_generated_list[ i ]
    56175330        if rp == nil then
    5618           # 生成したものを region(@through_list[i][3]) のリストに追加
     5331          # 生成したものを region(@through_list[i][3]) のリストに追加
    56195332          # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762
    56205333          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @through_generated_list[i] )
     
    56235336
    56245337      if i == 0 then
    5625         # 最も呼び口側のセルは、CDL 上の結合がないため、参ç
    5626 §ã•ã‚ŒãŸã“とにならない
    5627         # mikan namespace 対応
     5338        # 最も呼び口側のセルは、CDL 上の結合がないため、参照されたことにならない
     5339        # mikan namespace 対応
    56285340        # cell = Namespace.find( [ @through_generated_list[0].get_cell_name] )    #1
    56295341        if @through_generated_list[0] == nil then
    5630           return  # plugin_object の生成に失敗している
     5342          return  # plugin_object の生成に失敗している
    56315343        end
    56325344        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    56525364  end
    56535365
    5654   #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
     5366  #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
    56555367  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name )
    56565368
     
    56605372    plugin_arg            = through[ 2 ]
    56615373    if through[ 3 ] then
    5662       # region 間の through の場合
     5374      # region 間の through の場合
    56635375      @@start_region      = through[ 3 ]
    56645376      if next_cell.get_region.equal? @@start_region then
     
    56705382      @@region_count      = through[ 6 ]
    56715383    else
    5672       # 呼び口の through の場合
    5673       @@start_region      = @owner.get_region    # 呼び口側セルの region
    5674       @@end_region        = next_cell.get_region # 次のセルの region
    5675       @@through_type      = :THROUGH             # 呼び口の through 指定
     5384      # 呼び口の through の場合
     5385      @@start_region      = @owner.get_region    # 呼び口側セルの region
     5386      @@end_region        = next_cell.get_region # 次のセルの region
     5387      @@through_type      = :THROUGH             # 呼び口の through 指定
    56765388      @@region_count      = 0
    56775389    end
     
    56875399
    56885400    begin
    5689       eval( eval_str )     # plugin を生成
     5401      eval( eval_str )     # plugin を生成
    56905402      plugin_object.set_locale @locale
    56915403    rescue Exception => evar
     
    57025414    @through_generated_list[ i ] = plugin_object
    57035415
    5704     # Region に関するæƒ
    5705 å ±ã‚’設定
    5706     # 後から追加したので、new の引数外で設定
     5416    # Region に関する情報を設定
     5417    # 後から追加したので、new の引数外で設定
    57075418    # plugin_object.set_through_info( start_region, end_region, through_type )
    57085419
     
    57105421  end
    57115422
    5712   #プラグインへの引数で渡さないものを、一時的に記憶しておく
    5713   # プラグインの initialize の中でコールバックして設定する
     5423  #プラグインへの引数で渡さないものを、一時的に記憶しておく
     5424  # プラグインの initialize の中でコールバックして設定する
    57145425  @@plugin_creating_join = nil
    57155426  @@start_region = nil
     
    57185429  @@region_count = nil
    57195430
    5720   #=== Join# ThroughPlugin の追加æƒ
    5721 å ±ã‚’設定する
    5722   # このメソッドは ThroughPlugin#initialize から呼び出される
    5723   # plugin_object を生成する際の引数では不足するæƒ
    5724 å ±ã‚’追加する
     5431  #=== Join# ThroughPlugin の追加情報を設定する
     5432  # このメソッドは ThroughPlugin#initialize から呼び出される
     5433  # plugin_object を生成する際の引数では不足する情報を追加する
    57255434  def self.set_through_info plugin_object
    57265435    plugin_object.set_through_info( @@start_region, @@end_region, @@through_type,
     
    57345443  end
    57355444
    5736   #=== Join#é
    5737 åˆ—添数を得る
    5738   # @subscript の説明を参ç
    5739 §ã®ã“と
     5445  #=== Join#配列添数を得る
     5446  # @subscript の説明を参照のこと
    57405447  def get_subscript
    57415448    @subscript
    57425449  end
    57435450
    5744   def get_cell_name         # 受け口セル名
     5451  def get_cell_name         # 受け口セル名
    57455452    @cell_name
    57465453  end
     
    57545461  end
    57555462
    5756   #=== Join# 右辺の実セルを得る
    5757   #    実セルとは through で挿å
    5758 ¥ã•ã‚ŒãŸã‚‚の、composite のå†
    5759 éƒ¨ãªã©å®Ÿéš›ã«çµåˆã•ã‚Œã‚‹å
    5760 ˆ
    5761   #    このメソッドは get_rhs_port と対になっている
    5762   #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
     5463  #=== Join# 右辺の実セルを得る
     5464  #    実セルとは through で挿入されたもの、composite の内部など実際に結合される先
     5465  #    このメソッドは get_rhs_port と対になっている
     5466  #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
    57635467  def get_rhs_cell
    5764     # through 指定あり?
     5468    # through 指定あり?
    57655469    if @through_list[0] then
    5766       # mikan through で生成したものが root namespace 限定
     5470      # mikan through で生成したものが root namespace 限定
    57675471      if @through_generated_list[0] then
    57685472        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    57695473        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    5770         # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
    5771         # プラグイン生成コードがエラーになっている。
    5772         # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
     5474        # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
     5475        # プラグイン生成コードがエラーになっている。
     5476        # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
    57735477        return cell.get_real_cell( @through_generated_list[0].get_through_entry_port_name )
    57745478      else
    5775         return nil            # generate に失敗している
     5479        return nil            # generate に失敗している
    57765480      end
    57775481    elsif @cell then
    57785482      return @cell.get_real_cell( @port_name )
    57795483    else
    5780       # 右辺が未定義の場合 @cell は nil (既にエラー)
     5484      # 右辺が未定義の場合 @cell は nil (既にエラー)
    57815485      return nil
    57825486    end
    57835487  end
    57845488
    5785   #=== Join# 右辺のセルを得る
    5786   # 右辺のセルを得る。ただし、composite 展開されていない
    5787   # composite 展開されたものを得るには get_rhs_cell を使う
    5788   # プロトタイプ宣言しかされていない場合には、こちらしか使えない
    5789   # このメソッドは get_rhs_port2 と対になっている
     5489  #=== Join# 右辺のセルを得る
     5490  # 右辺のセルを得る。ただし、composite 展開されていない
     5491  # composite 展開されたものを得るには get_rhs_cell を使う
     5492  # プロトタイプ宣言しかされていない場合には、こちらしか使えない
     5493  # このメソッドは get_rhs_port2 と対になっている
    57905494  def get_rhs_cell2
    5791     # through 指定あり?
     5495    # through 指定あり?
    57925496    if @through_list[0] then
    5793       # mikan through で生成したものが root namespace 限定
     5497      # mikan through で生成したものが root namespace 限定
    57945498      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name ] )
    57955499      if @through_generated_list[0] then
     
    57975501        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    57985502      else
    5799         cell = @cell            # generate に失敗している
     5503        cell = @cell            # generate に失敗している
    58005504      end
    58015505    else
     
    58065510  end
    58075511
    5808   #=== Join# 右辺のセルを得る
    5809   # through は適用しないが、composite は展開した後のセル
    5810   # (意味解析が終わっていないと、composite 展開が終わっていない)
    5811   # このメソッドは get_rhs_port3 と対になっている
     5512  #=== Join# 右辺のセルを得る
     5513  # through は適用しないが、composite は展開した後のセル
     5514  # (意味解析が終わっていないと、composite 展開が終わっていない)
     5515  # このメソッドは get_rhs_port3 と対になっている
    58125516  def get_rhs_cell3
    58135517    if @cell then
     
    58165520  end
    58175521
    5818   #=== Join# 右辺のセルのリージョンを得る
    5819   # 右辺が未定義の場合、nil を返す
    5820   # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
    5821   # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
     5522  #=== Join# 右辺のセルのリージョンを得る
     5523  # 右辺が未定義の場合、nil を返す
     5524  # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
     5525  # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
    58225526  def get_rhs_region
    5823     # through 指定あり?
     5527    # through 指定あり?
    58245528    if @through_list[0] then
    58255529      if @through_generated_list[0] then
    5826         # mikan through で生成したものが root namespace 限定
     5530        # mikan through で生成したものが root namespace 限定
    58275531        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    58285532        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    58315535        end
    58325536      else
    5833         return nil       # generate に失敗している
     5537        return nil       # generate に失敗している
    58345538      end
    58355539    elsif @cell then
    58365540      return @cell.get_region
    58375541    end
    5838     # 右辺が未定義の場合 @cell は nil (既にエラー)
     5542    # 右辺が未定義の場合 @cell は nil (既にエラー)
    58395543    return nil
    58405544  end
    58415545
    5842   def get_cell_global_name  # 受け口セル名(コンポジットなら展開したå†
    5843 å´ã®ã‚»ãƒ«ï¼‰
     5546  def get_cell_global_name  # 受け口セル名(コンポジットなら展開した内側のセル)
    58445547
    58455548    # debug
     
    58555558  end
    58565559
    5857   #===  Join# 結合の右辺の受け口の名前
    5858   #     namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
    5859   #subscript:: Integer  呼び口é
    5860 åˆ—の時添数 または nil 呼び口é
    5861 åˆ—でない時
    5862   def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開したå†
    5863 å´ã®ã‚»ãƒ«ï¼‰
     5560  #===  Join# 結合の右辺の受け口の名前
     5561  #     namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
     5562  #subscript:: Integer  呼び口配列の時添数 または nil 呼び口配列でない時
     5563  def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開した内側のセル)
    58645564
    58655565    # debug
    58665566    dbgPrint "Cell get_port_global_name:  #{@cell_name}\n"
    58675567
    5868     # through 指定あり?
     5568    # through 指定あり?
    58695569    if @through_list[0] then
    58705570
    5871       # mikan through で生成したものが root namespace 限定
     5571      # mikan through で生成したものが root namespace 限定
    58725572      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    58735573      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    58745574
    5875       # through で挿å
    5876 ¥ã•ã‚ŒãŸã‚»ãƒ«ã§ã€å®Ÿéš›ã«æŽ¥ç¶šã•ã‚Œã‚‹ã‚»ãƒ«ï¼ˆcompositeの場合å†
    5877 éƒ¨ã®)の受け口の C 言語名前
     5575      # through で挿入されたセルで、実際に接続されるセル(compositeの場合内部の)の受け口の C 言語名前
    58785576      return cell.get_real_global_port_name( @through_generated_list[0].get_through_entry_port_name )
    58795577    else
    58805578
    5881       # 実際に接続されるセルの受け口の C 言語名前
     5579      # 実際に接続されるセルの受け口の C 言語名前
    58825580      if @cell then
    58835581        return @cell.get_real_global_port_name( @port_name )
     
    59025600  end
    59035601
    5904   #=== Join# 右辺のポートを得る
    5905   #    右辺が composite の場合は、å†
    5906 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ, through の場合は挿å
    5907 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ
    5908   #    このメソッドは get_rhs_cell と対になっている
     5602  #=== Join# 右辺のポートを得る
     5603  #    右辺が composite の場合は、内部の繋がるセルのポート, through の場合は挿入されたセルのポート
     5604  #    このメソッドは get_rhs_cell と対になっている
    59095605  def get_rhs_port
    5910     # through 指定あり?
     5606    # through 指定あり?
    59115607    if @through_list[0] then
    5912       # mikan through で生成したものが root namespace 限定
    5913       # through で生成されたセルを探す
     5608      # mikan through で生成したものが root namespace 限定
     5609      # through で生成されたセルを探す
    59145610#      cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    59155611      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    5916       # cell のプラグインで生成されたポート名のポートを探す (composite ならå†
    5917 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆ)
     5612      # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート)
    59185613      return cell.get_real_port( @through_generated_list[0].get_through_entry_port_name )
    59195614    else
    5920       # ポートを返す(composite ならå†
    5921 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆã‚’返す)
     5615      # ポートを返す(composite なら内部の繋がるポートを返す)
    59225616      return @cell.get_real_port( @port_name )
    59235617    end
    59245618  end
    59255619
    5926   #=== Join# 右辺のポートを得る
    5927   # 右辺のポートを得る。
    5928   # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
     5620  #=== Join# 右辺のポートを得る
     5621  # 右辺のポートを得る。
     5622  # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
    59295623  def get_rhs_port2
    5930     # through 指定あり?
     5624    # through 指定あり?
    59315625    if @through_list[0] then
    59325626      if @through_generated_list[0] then
    59335627        port = @through_generated_list[0].get_through_entry_port_name.to_sym
    59345628      else
    5935         port = @port_name    # generate に失敗している
     5629        port = @port_name    # generate に失敗している
    59365630      end
    59375631    else
     
    59425636  end
    59435637
    5944   #=== Join# 右辺のポートを得る
    5945   # through は適用しないが、composite は展開した後のセルの対応するポート
     5638  #=== Join# 右辺のポートを得る
     5639  # through は適用しないが、composite は展開した後のセルの対応するポート
    59465640  def get_rhs_port3
    59475641    if @cell then
     
    59505644  end
    59515645
    5952   #=== Join# 呼び口é
    5953 åˆ—の2番目以降の要素を追加する
    5954   #     ä¸€ç•ªæœ€åˆã«å®šç¾©ã•ã‚ŒãŸé
    5955 åˆ—要素がå
    5956 ¨è¦ç´ ã®åˆæœŸå€¤ã®é
    5957 åˆ—を持つ
    5958   #     ã“のメソッドは非é
    5959 åˆ—の場合も呼出される(join 重複エラーの場合)
    5960   #join2:: Join  呼び口é
    5961 åˆ—要素の Join
     5646  #=== Join# 呼び口配列の2番目以降の要素を追加する
     5647  #     一番最初に定義された配列要素が全要素の初期値の配列を持つ
     5648  #     このメソッドは非配列の場合も呼出される(join 重複エラーの場合)
     5649  #join2:: Join  呼び口配列要素の Join
    59625650  def add_array_member join2
    59635651
    5964     # subscript2: join2 の左辺添数
     5652    # subscript2: join2 の左辺添数
    59655653    subscript2 = join2.get_subscript
    59665654
    59675655    if @subscript == nil then           # not array : initialize duplicate
    5968       # 非é
    5969 åˆ—の場合、join が重複している
     5656      # 非配列の場合、join が重複している
    59705657      cdl_error( "S1127 \'$1\' duplicate", @name )
    59715658      # print "add_array_member2: #{@owner.get_name}\n"
    59725659
    59735660    elsif @subscript >= 0 then
    5974       # 添数指定ありの場合
     5661      # 添数指定ありの場合
    59755662      if( subscript2 == nil || subscript2 < 0 ) then
    5976         # join2 左辺は非é
    5977 åˆ—または添数なし
    5978         # é
    5979 åˆ—が不一致
     5663        # join2 左辺は非配列または添数なし
     5664        # 配列が不一致
    59805665        cdl_error( "S1128 \'$1\' inconsistent array definition", @name )
    59815666      elsif @array_member[subscript2] != nil then
    5982         # 同じ添数が既に定義済み
     5667        # 同じ添数が既に定義済み
    59835668        cdl_error( "S1129 \'$1\' redefinition of subscript $2" ,@name, subscript2 )
    59845669      else
    5985         # 添数の位置に要素を追加
     5670        # 添数の位置に要素を追加
    59865671        @array_member[subscript2] = join2.get_rhs
    59875672        @array_member2[subscript2] = join2
     
    59905675
    59915676    else
    5992       # 添数指定なしの場合
     5677      # 添数指定なしの場合
    59935678      if( subscript2 == nil || subscript2 >= 0 ) then
    5994         # join2 左辺は非é
    5995 åˆ—または添数有
    5996         # é
    5997 åˆ—が不一致
     5679        # join2 左辺は非配列または添数有
     5680        # 配列が不一致
    59985681        cdl_error( "S1130 \'R1\' inconsistent array definition", @name )
    59995682      end
    60005683
    6001       # 添数なしé
    6002 åˆ—の場合、é
    6003 åˆ—要素を追加
     5684      # 添数なし配列の場合、配列要素を追加
    60045685      @array_member  << join2.get_rhs
    60055686      @array_member2 << join2
     
    60255706      while i < @array_member2.length
    60265707        if @array_member2[i] != self && @array_member[i] != nil then
    6027           # @array_member2[i] が nil になるのは optional の時と、
    6028           # Join の initialize で無駄に @array_member2 が設定されている場合
    6029           # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6030 è¦ã¯ãªã„(clone_for_composite では対策している)
     5708          # @array_member2[i] が nil になるのは optional の時と、
     5709          # Join の initialize で無駄に @array_member2 が設定されている場合
     5710          # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    60315711          @array_member2[i].change_name( name )
    60325712        end
     
    60365716  end
    60375717
    6038   # composite cell を展開したセルの結合を clone したセルの名前に変更
     5718  # composite cell を展開したセルの結合を clone したセルの名前に変更
    60395719  def change_rhs_port( clone_cell_list, celltype )
    60405720
     
    60545734    dbgPrint "  cell_name:   #{@cell_name} => #{c.get_global_name}, #{c.get_name}\n"
    60555735
    6056     # @rhs のå†
    6057 å®¹ã‚’調整しておく(このå†
    6058 å®¹ã¯ã€subscript を除いて、後から使われていない)
     5736    # @rhs の内容を調整しておく(この内容は、subscript を除いて、後から使われていない)
    60595737    elements = @rhs.get_elements
    6060     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    6061 åˆ—?
     5738    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    60625739      elements  = elements[1]
    60635740    end
    60645741
    6065     # 右辺が cell.ePort の形式でない
     5742    # 右辺が cell.ePort の形式でない
    60665743    if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER then   #1
    60675744      return
    60685745    else
    6069       # セル名を composite å†
    6070 éƒ¨ã®åå‰ã‹ã‚‰ã€å¤–部の名前にå
    6071 ¥ã‚Œæ›¿ãˆã‚‹
     5746      # セル名を composite 内部の名前から、外部の名前に入れ替える
    60725747      # elements[1][1] = Token.new( c.get_name, nil, nil, nil )
    60735748      elements[1][1] = NamespacePath.new( c.get_name, false, c.get_namespace )
     
    60765751    @cell_name = c.get_name
    60775752    @cell = c
    6078     # @definition = nil          # @definition が有効: チェック済み(とは、しない)
     5753    # @definition = nil          # @definition が有効: チェック済み(とは、しない)
    60795754
    60805755    if @array_member2 then
     
    60855760      i = 0
    60865761      while i < @array_member2.length
    6087         # @array_member2[i] が nil になるのは optional の時と、
    6088         # Join の initialize で無駄に @array_member2 が設定されている場合
    6089         # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6090 è¦ã¯ãªã„(clone_for_composite では対策している)
     5762        # @array_member2[i] が nil になるのは optional の時と、
     5763        # Join の initialize で無駄に @array_member2 が設定されている場合
     5764        # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    60915765        if @array_member2[i] != self && @array_member[i] != nil then
    60925766          @array_member2[i].change_rhs_port( clone_cell_list, celltype )
     
    60985772  end
    60995773
    6100   #=== Join# composite セル用にクローン
    6101   #cell_global_name:: string : 親セルのグローバル名
    6102   # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
    6103   # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
    6104   # (å†
    6105 éƒ¨ã‚»ãƒ«ã® C_EXP もここで置換される)
    6106   # @through_list などもコピーされるので、これが呼び出される前に確定するå¿
    6107 è¦ãŒã‚ã‚‹
     5774  #=== Join# composite セル用にクローン
     5775  #cell_global_name:: string : 親セルのグローバル名
     5776  # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
     5777  # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
     5778  # (内部セルの C_EXP もここで置換される)
     5779  # @through_list などもコピーされるので、これが呼び出される前に確定する必要がある
    61085780  def clone_for_composite( ct_name, cell_name, locale, b_need_recursive = true )
    61095781
     
    61255797
    61265798  def clone_array_member( array_member, array_member2, ct_name, cell_name, prev, locale )
    6127     # é
    6128 åˆ—のコピーを作る
     5799    # 配列のコピーを作る
    61295800    am  = array_member.clone
    61305801    am2 = array_member2.clone
    61315802
    6132     # é
    6133 åˆ—要素のコピーを作る
     5803    # 配列要素のコピーを作る
    61345804    i = 0
    61355805    while i < am2.length
    61365806      if array_member2[i] == prev then
    6137         # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
     5807        # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
    61385808        am2[i] = self
    61395809      elsif array_member2[i] then
    61405810        am2[i] = array_member2[i].clone_for_composite( ct_name, cell_name, locale, false )
    61415811      else
    6142         # 以前のエラーで array_member2[i] は nil になっている
     5812        # 以前のエラーで array_member2[i] は nil になっている
    61435813      end
    61445814
     
    61495819    end
    61505820
    6151     # i = 0 は、ここで自分自身を設定
     5821    # i = 0 は、ここで自分自身を設定
    61525822    # am2[0] = self
    61535823
     
    61575827  end
    61585828
    6159   #=== Join# rhs をå
    6160 ¥ã‚Œæ›ãˆã‚‹
     5829  #=== Join# rhs を入れ換える
    61615830  #rhs:: Expression | initializer
    6162   # 右辺をå
    6163 ¥ã‚Œæ›ãˆã‚‹ï¼Ž
    6164   # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
    6165   # このメソッドは composite å†
    6166 ã® cell の属性の初期値が定数ではなく式になった場合、不要になる
     5831  # 右辺を入れ換える.
     5832  # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
     5833  # このメソッドは composite 内の cell の属性の初期値が定数ではなく式になった場合、不要になる
    61675834  def change_rhs rhs
    61685835    @rhs = rhs
    61695836  end
    61705837
    6171   #=== Join# clone された join の owner を変更
     5838  #=== Join# clone された join の owner を変更
    61725839  def set_cloned( owner )
    61735840    dbgPrint "Join#set_cloned: #{@name}  prev owner: #{@owner.get_name} new owner: #{owner.get_name}\n"
     
    62555922end
    62565923
    6257 #== 逆結合
     5924#== 逆結合
    62585925class ReverseJoin < BDNode
    62595926#@ep_name:: Symbol
     
    62805947end
    62815948
    6282 # CLASS: CompositeCelltype 用の Join
    6283 # REM:   CompositeCelltype が export するもの
     5949# CLASS: CompositeCelltype 用の Join
     5950# REM:   CompositeCelltype が export するもの
    62845951class CompositeCelltypeJoin < BDNode
    6285 # @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
    6286 # @internal_cell_name:: string : CompositeCelltype å†
    6287 éƒ¨ã®ã‚»ãƒ«ã®åå‰
    6288 # @internal_cell_elem_name:: string : CompositeCelltype å†
    6289 éƒ¨ã®ã‚»ãƒ«ã®å‘¼ã³å£ã€å—け口、属性の名前
    6290 # @cell : Cell : Cell::  internal cell  : CompositeCelltyep å†
    6291 éƒ¨ã®ã‚»ãƒ«ï¼ˆin_compositeセル)
     5952# @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
     5953# @internal_cell_name:: string : CompositeCelltype 内部のセルの名前
     5954# @internal_cell_elem_name:: string : CompositeCelltype 内部のセルの呼び口、受け口、属性の名前
     5955# @cell : Cell : Cell::  internal cell  : CompositeCelltyep 内部のセル(in_compositeセル)
    62925956# @port_decl:: Port | Decl
    62935957# @b_pseudo: bool :
     
    63045968  end
    63055969
    6306   #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
    6307   #cell::  Cell 対象かどうかチェックするセル
     5970  #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
     5971  #cell::  Cell 対象かどうかチェックするセル
    63085972  #
    6309   #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
    6310   #     port_decl が指定された場合は、現状使われていない
     5973  #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
     5974  #     port_decl が指定された場合は、現状使われていない
    63115975  def match?( cell, port_decl = nil )
    63125976
     
    63245988
    63255989#    if @cell.equal?( cell ) && ( port_decl == nil || @port_decl.equal?( port_decl ) ) then
    6326     # なぜ port_decl が一致しなければならなかったか忘れた。
    6327     # recursive_composite で名前の一致に変更   060917
     5990    # なぜ port_decl が一致しなければならなかったか忘れた。
     5991    # recursive_composite で名前の一致に変更   060917
    63285992    if((@cell.get_name == cell.get_name) && (port_decl == nil || @port_decl.get_name == port_decl.get_name))then
    63295993      true
     
    63576021  end
    63586022
    6359   # @port_decl が Port の場合のみ呼び出してよい
     6023  # @port_decl が Port の場合のみ呼び出してよい
    63606024  def get_port_type
    63616025    if @port_decl then
     
    63796043  end
    63806044
    6381   # @port_decl が Port の場合のみ呼び出してよい
     6045  # @port_decl が Port の場合のみ呼び出してよい
    63826046  def is_require?
    63836047    if @port_decl then
     
    63866050  end
    63876051
    6388   # @port_decl が Port の場合のみ呼び出してよい
     6052  # @port_decl が Port の場合のみ呼び出してよい
    63896053  def is_allocator_port?
    63906054    if @port_decl then
     
    63936057  end
    63946058
    6395   # @port_decl が Port の場合のみ呼び出してよい
     6059  # @port_decl が Port の場合のみ呼び出してよい
    63966060  def is_optional?
    63976061    if @port_decl then
     
    64006064  end
    64016065
    6402   #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
    6403   # このメソッドは Cell の check_join から初期値チェックのために呼び出される
     6066  #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
     6067  # このメソッドは Cell の check_join から初期値チェックのために呼び出される
    64046068  def get_initializer
    64056069    if @port_decl.instance_of? Decl then
     
    64146078  end
    64156079
    6416   #=== CompositeCelltypeJoin# é
    6417 åˆ—サイズを得る
    6418   #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
     6080  #=== CompositeCelltypeJoin# 配列サイズを得る
     6081  #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
    64196082  def get_array_size
    64206083    @port_decl.get_array_size
    64216084  end
    64226085
    6423   #=== CompositeCelltypeJoin# signature を得る
    6424   # @port_decl が Port の時のみ呼び出してもよい
     6086  #=== CompositeCelltypeJoin# signature を得る
     6087  # @port_decl が Port の時のみ呼び出してもよい
    64256088  def get_signature
    64266089    @port_decl.get_signature
     
    64656128# @file_name:: string
    64666129# @format:: string
    6467 # @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
     6130# @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
    64686131# @f_celltype:: bool : true: celltype factory, false: cell factory
    64696132
     
    64766139    case name
    64776140    when :write
    6478       # write 関数
     6141      # write 関数
    64796142      @name = name
    64806143
    6481       # write 関数の第一引数:出力å
    6482 ˆãƒ•ã‚¡ã‚¤ãƒ«å
    6483         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6144      # write 関数の第一引数:出力先ファイル名
     6145        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    64846146      @file_name = file_name.eval_const(nil).val  # file_name : Expression
    64856147      if ! @file_name.instance_of?( String ) then
    6486         # 文字列定数ではなかった
     6148        # 文字列定数ではなかった
    64876149        cdl_error( "S1132 $1: 1st parameter is not string(file name)" , @name )
    64886150        @file_name = nil
    64896151      end
    64906152
    6491       # write 関数の第二引数:フォーマット文字列
     6153      # write 関数の第二引数:フォーマット文字列
    64926154      @format    = format.eval_const(nil).val     # format : Expression
    6493         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6155        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    64946156      if ! @format.instance_of?( String ) then
    6495         # 文字列定数ではなかった
     6157        # 文字列定数ではなかった
    64966158        cdl_error( "S1133 $1: 2nd parameter is not string(fromat)" , @name )
    64976159        @format = nil
    64986160      end
    64996161
    6500       # 第三引数以降を引数リストとする mikan 引数のチェック
     6162      # 第三引数以降を引数リストとする mikan 引数のチェック
    65016163      @arg_list = arg_list
    65026164
     
    65756237#== Domain
    65766238#
    6577 # region の domain を記憶するクラス
     6239# region の domain を記憶するクラス
    65786240class DomainType < Node
    6579 #@name::Symbol : ドメインタイプの名前 ex) HRP2
     6241#@name::Symbol : ドメインタイプの名前 ex) HRP2
    65806242#@region::Region
    65816243#@plugin_name::Symbol : ex) HRP2Plugin
    65826244#@option::String : ex) "trusted", "nontrusted"
    6583 #@plugin::DomainPlugin の子クラス
     6245#@plugin::DomainPlugin の子クラス
    65846246
    65856247  include PluginModule
    65866248
    6587   # ドメインに属する region の Hash
    6588   # domain 指定が一度も行われない場合、このリストは空である
    6589   # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
     6249  # ドメインに属する region の Hash
     6250  # domain 指定が一度も行われない場合、このリストは空である
     6251  # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
    65906252  @@domain_regions = { }  # { :domain_type => [ region, ... ] }
    65916253
     
    66286290  end
    66296291
    6630   #== Domain リージョンの Hash を得る
    6631   # @@domain_regions の説明参ç
    6632 §
     6292  #== Domain リージョンの Hash を得る
     6293  # @@domain_regions の説明参照
    66336294  def self.get_domain_regions
    66346295    return @@domain_regions
     
    66496310end
    66506311
    6651 #== Region クラス
     6312#== Region クラス
    66526313#
    6653 # Region は Namespace を継承している
    6654 # root region は特殊で、root namespace と同じである
     6314# Region は Namespace を継承している
     6315# root region は特殊で、root namespace と同じである
    66556316#
    6656 # cell は region に属する
    6657 # region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
     6317# cell は region に属する
     6318# region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
    66586319#
    66596320class Region < Namespace
    66606321# @name:: string
    6661 # @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
    6662 # @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
     6322# @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
     6323# @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
    66636324# @to_through_list:: [ [ dst_region, plugin_name, plugin_arg ], ... ]
    6664 # @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
    6665 #    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
     6325# @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
     6326#    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
    66666327# @region_type::Symbol : :NODE, :LINKUNIT, :DOMAIN, :CLASS
    6667 # @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
    6668 # @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
    6669 # @family_line:: [ @region_root, ...,@region_me ]  家系
    6670 # @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
    6671 # @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
    6672 # @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
    6673 # @domain_type::DomainType : domain 指定されていない場合、nil
    6674 # @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
     6328# @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
     6329# @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
     6330# @family_line:: [ @region_root, ...,@region_me ]  家系
     6331# @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
     6332# @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
     6333# @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
     6334# @domain_type::DomainType : domain 指定されていない場合、nil
     6335# @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
    66756336
    66766337  @@in_through_list  = []
     
    66806341  @@region_type_param = nil
    66816342  @@domain_name = nil
    6682   @@domain_option = nil    # Token がå
    6683 ¥ã‚‹
     6343  @@domain_option = nil    # Token が入る
    66846344
    66856345  @@link_roots = []
    66866346
    66876347  def initialize( name )
    6688     # mikan name の Namespace 修飾
    6689     # object = Namespace.find( [ name ] )   # 親まで捜しにいく
     6348    # mikan name の Namespace 修飾
     6349    # object = Namespace.find( [ name ] )   # 親まで捜しにいく
    66906350    if name != "::" then
    66916351      object = Namespace.get_current.find( name )    #1
    66926352    else
    6693       # root リージョン
     6353      # root リージョン
    66946354      object = nil
    66956355      @@region_type = :NODE
     
    67276387        dbgPrint "Region.new: re-appear #{@name}\n"
    67286388
    6729         # # Region path が前回出現と一致するか?
     6389        # # Region path が前回出現と一致するか?
    67306390        # if @@region_stack[ @@region_stack_sp - 1 ] then
    67316391        #   my_path = @@region_stack[ @@region_stack_sp - 1 ].get_path_string.to_s + "." + @name.to_s
     
    67376397        # end
    67386398
    6739         # 再出現
     6399        # 再出現
    67406400        # @@region_stack[@@region_stack_sp] = object
    67416401
    6742         # 再出現時に specifier が指定されているか?
     6402        # 再出現時に specifier が指定されているか?
    67436403        if( @in_through_list.length != 0 || @out_through_list.length != 0 || @to_through_list.length != 0 || @region_type != nil )then
    67446404          cdl_error( "S1140 $1: region specifier must place at first appearence" , name )
     
    67476407
    67486408      else
    6749         # エラー用ダミー定義
    6750 
    6751         # 異なる同名のオブジェクトが定義済み
     6409        # エラー用ダミー定義
     6410
     6411        # 異なる同名のオブジェクトが定義済み
    67526412        cdl_error( "S1141 $1 duplication, previous one : $2" , name, object.class )
    6753         # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
    6754       end
    6755     else
    6756       # 初出現
     6413        # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
     6414      end
     6415    else
     6416      # 初出現
    67576417      dbgPrint "Region.new: #{@name}\n"
    67586418      set_region_family_line
     
    68076467  end
    68086468
    6809   #== Region ルートリージョンを得る
    6810   # ルートリージョンは、ルートネームスペースと同じである
     6469  #== Region ルートリージョンを得る
     6470  # ルートリージョンは、ルートネームスペースと同じである
    68116471  def self.get_root
    68126472    Namespace.get_root
     
    68166476
    68176477    dbgPrint  "set_region_family_line: Region: #{@name}  \n"
    6818     # root namespace (root region) の region type は :NODE
     6478    # root namespace (root region) の region type は :NODE
    68196479    if @name == "::" then
    68206480      @region_type = :NODE
     
    68346494
    68356495    if @domain_type then
    6836       # ルートリージョンが最初から @domain_type 設定されることはないの
    6837       # で @owner == nil を調べるå¿
    6838 è¦ã¯ãªã„
     6496      # ルートリージョンが最初から @domain_type 設定されることはないの
     6497      # で @owner == nil を調べる必要はない
    68396498      @owner.set_domain_type @domain_type
    68406499    end
     
    68506509    @link_root = nil
    68516510
    6852     # @family_line を作成する
    6853     # @link_root もみつける
    6854     # (上位にたどっていって Region で node または linkunit のいずれかå
    6855 ˆã«è¦‹ã¤ã‹ã£ãŸã‚‚のが @link_root となる)
    6856     # root namespace は Region かつ node なのでå¿
    6857 ãš @link_root は見つかる
    6858     # mikan: self が node, linkUnit の場合、ここで期å¾
    6859 ã—たとおりに設定されないため、Region#initialize で再設定
     6511    # @family_line を作成する
     6512    # @link_root もみつける
     6513    # (上位にたどっていって Region で node または linkunit のいずれか先に見つかったものが @link_root となる)
     6514    # root namespace は Region かつ node なので必ず @link_root は見つかる
     6515    # mikan: self が node, linkUnit の場合、ここで期待したとおりに設定されないため、Region#initialize で再設定
    68606516    obj = self
    68616517    while 1
     
    68686524        end
    68696525      else
    6870         # さもなければ Namespace
    6871         # namespace の下に region がある場合
    6872       end
    6873 
    6874       # root namespace にたどり着けば終り
     6526        # さもなければ Namespace
     6527        # namespace の下に region がある場合
     6528      end
     6529
     6530      # root namespace にたどり着けば終り
    68756531      break if obj.get_name == "::"
    68766532
     
    68836539  end
    68846540
    6885   #== Region#ドメインを設定する
     6541  #== Region#ドメインを設定する
    68866542  def set_domain_type domain_type
    68876543    if @region_type == :NODE then
     
    69276583  end
    69286584
    6929   #== Region# domain の根っことなる region を得る
    6930   # Region のインスタンスを返す
    6931   # domain 指定子があれば、そのリージョンがドメインルートである
    6932   # なければ、親リージョンのドメインルートとする
     6585  #== Region# domain の根っことなる region を得る
     6586  # Region のインスタンスを返す
     6587  # domain 指定子があれば、そのリージョンがドメインルートである
     6588  # なければ、親リージョンのドメインルートとする
    69336589  def get_domain_root
    69346590    @domain_root
     
    69706626  end
    69716627
    6972   #=== Region# 構文解析中の region を得る
    6973   # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
    6974   # cell が namespace 下におくことができなければ、ループをまわすå¿
    6975 è¦ã¯ãªã„
     6628  #=== Region# 構文解析中の region を得る
     6629  # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
     6630  # cell が namespace 下におくことができなければ、ループをまわす必要はない
    69766631  def self.get_current
    69776632    # @@region_stack[@@region_stack_sp]
     
    69866641  end
    69876642
    6988   #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
    6989   # mikan namesppace 対応 (cell_name)
     6643  #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
     6644  # mikan namesppace 対応 (cell_name)
    69906645  def add_cell_port_through_plugin( cell_name, port_name, through_plugin_object )
    69916646    @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}" ] = through_plugin_object
     
    70026657  end
    70036658
    7004   #=== Region# to_region への距離(unreachable な場合 nil)
    7005   # mikan Cell#check_region とRegion へたどり着くまでための処理にå
    7006 ±é€šæ€§ãŒé«˜ã„
    7007   # region#distance は require で用いられる
     6659  #=== Region# to_region への距離(unreachable な場合 nil)
     6660  # mikan Cell#check_region とRegion へたどり着くまでための処理に共通性が高い
     6661  # region#distance は require で用いられる
    70086662  def distance( to_region )
    70096663
    7010     r1 = self                   # 出発 region
    7011     r2 = to_region              # 目的 region
     6664    r1 = self                   # 出発 region
     6665    r2 = to_region              # 目的 region
    70126666    dist = 0
    70136667
    7014     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    7015 
    7016       # mikan namespace 対応
     6668    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     6669
     6670      # mikan namespace 対応
    70176671      f1 = r1.get_family_line
    70186672      len1 = f1.length
     
    70206674      len2 = f2.length
    70216675
    7022       # 不一致になるところ(å
    7023 „弟)を探す
    7024       i = 1  # i = 0 は :RootRegion なのでå¿
    7025 ãšä¸€è‡´
     6676      # 不一致になるところ(兄弟)を探す
     6677      i = 1  # i = 0 は :RootRegion なので必ず一致
    70266678      while( i < len1 && i < len2 )
    70276679        if( f1[i] != f2[i] )then
     
    70316683      end
    70326684
    7033       sibling_level = i     # å
    7034 „弟となるレベル、もしくはどちらか一方が終わったレベル
     6685      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    70356686
    70366687      # p "sibling_level: #{i}"
     
    70386689      # p "to: #{f2[i].get_name}" if f2[i]
    70396690
    7040       # 呼び側について呼びå
    7041 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    7042 „弟レベルまで(out_through をチェックおよび挿å
    7043 ¥ï¼‰
     6691      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    70446692      i = len1 -1
    70456693      while i >= sibling_level
     
    70646712      end
    70656713
    7066       # å
    7067 „弟レベルにおいて(to_through をチェックおよび挿å
    7068 ¥ï¼‰
     6714      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    70696715      if f1[sibling_level] && f2[sibling_level] then
    70706716        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
     
    70816727          found = 0
    70826728          f1[sibling_level].get_to_through_list.each { |t|
    7083             if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     6729            if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    70846730              found = 1
    70856731            end
     
    70926738      end
    70936739
    7094       # 受け側についてå
    7095 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    7096 ¥ï¼‰
     6740      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    70976741      i = sibling_level
    70986742      while i < len2
     
    71376781class Import_C < Node
    71386782
    7139   # ヘッダの名前文字列のリスト
     6783  # ヘッダの名前文字列のリスト
    71406784  @@header_list = {}
    71416785  @@header_list2 = []
    71426786  @@define_list = {}
    71436787
    7144   #=== Import_C# import_C の生成(ヘッダファイルを取込む)
    7145   #header:: Token : import_C の第一引数文字列リテラルトークン
    7146   #define:: Token : import_C の第二引数文字列リテラルトークン
     6788  #=== Import_C# import_C の生成(ヘッダファイルを取込む)
     6789  #header:: Token : import_C の第一引数文字列リテラルトークン
     6790  #define:: Token : import_C の第二引数文字列リテラルトークン
    71476791  def initialize( header, define = nil )
    71486792    super()
    7149     # ヘッダファイル名文字列から前後の "" を取り除く
     6793    # ヘッダファイル名文字列から前後の "" を取り除く
    71506794    # header = header.to_s.gsub( /\A"(.*)"\z/, '\1' )
    71516795    header = CDLString.remove_dquote header.to_s
    71526796
    71536797    if define then
    7154       # 前後の "" を取り除く
     6798      # 前後の "" を取り除く
    71556799      # def_opt = define.to_s.gsub( /\A"(.*)/, '\1' )
    71566800      # def_opt.sub!( /(.*)"\z/, '\1' )
    71576801      def_opt = CDLString.remove_dquote define.to_s
    71586802
    7159       # "," を -D に置き換え
     6803      # "," を -D に置き換え
    71606804      def_opt = def_opt.gsub( /,/, " -D " )
    71616805
    7162       # å
    7163 ˆé ­ã« -D を挿å
    7164 ¥ # mikan 不適切な define å
    7165 ¥åŠ›ãŒã‚った場合、CPP 時にエラー
     6806      # 先頭に -D を挿入 # mikan 不適切な define 入力があった場合、CPP 時にエラー
    71666807      def_opt = def_opt.gsub( /^/, "-D " )
    71676808
    71686809    end
    71696810
    7170     # コマンドライン指定された DEFINE
     6811    # コマンドライン指定された DEFINE
    71716812    $define.each{ |define|
    71726813      if $IN_EXERB then
     
    71896830      if found == false then
    71906831        begin
    7191           # ファイルの stat を取ってみる(なければ例外発生)
     6832          # ファイルの stat を取ってみる(なければ例外発生)
    71926833          File.stat( "#{path}/#{header}" )
    71936834
    7194           # cdl を見つかったファイルパスに再設定
     6835          # cdl を見つかったファイルパスに再設定
    71956836          header_path = "#{path}/#{header}"
    71966837          found = true
     
    72076848    end
    72086849
    7209     # 読込み済み?
     6850    # 読込み済み?
    72106851    if( @@header_list[ header ] ) then
    7211       # 第二引数 define が以前と異なる
     6852      # 第二引数 define が以前と異なる
    72126853      if @@define_list[ header ].to_s != define.to_s then
    72136854        cdl_error( "S1143 import_C: arg2: mismatch with previous one"  )
    72146855      end
    7215       # いずれにせよ読み込まない
     6856      # いずれにせよ読み込まない
    72166857      return
    72176858    end
    72186859
    7219     # ヘッダのリストを記録
     6860    # ヘッダのリストを記録
    72206861    @@header_list[ header ] = header_path
    72216862    @@header_list2 << header
     
    72416882    end
    72426883
    7243     # CPP 出力用 tmp ファイル名
     6884    # CPP 出力用 tmp ファイル名
    72446885    tmp_header = header.gsub( /\//, "_" )
    72456886    tmp_header = "#{$gen}/tmp_#{tmp_header}"
    72466887
    7247     # CPP コマンドラインを作成
     6888    # CPP コマンドラインを作成
    72486889    cmd = "#{$cpp} #{def_opt} #{include_opt} #{tmp_C}"
    72496890
     
    72536894      end
    72546895
    7255       # プリプロセッサコマンドを pipe として開く
    7256           # cmd は cygwin/Linux では bash(sh) 経由で実行される
    7257           # Exerb 版では cmd.exe 経由で実行される
    7258           # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
     6896      # プリプロセッサコマンドを pipe として開く
     6897          # cmd は cygwin/Linux では bash(sh) 経由で実行される
     6898          # Exerb 版では cmd.exe 経由で実行される
     6899          # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
    72596900          cpp = IO.popen( cmd, "r:ASCII-8BIT" )
    72606901      begin
     
    72696910        print_exception( evar )
    72706911      ensure
    7271         tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
     6912        tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
    72726913        cpp.close
    72736914      end
     
    72776918    end
    72786919
    7279     # C 言語のパーサインスタンスを生成
     6920    # C 言語のパーサインスタンスを生成
    72806921    c_parser = C_parser.new
    72816922
    7282     # tmp_header をパース
     6923    # tmp_header をパース
    72836924    c_parser.parse( [tmp_header] )
    72846925
    7285     # 終期化 パーサスタックを戻す
     6926    # 終期化 パーサスタックを戻す
    72866927    c_parser.finalize
    72876928
     
    73376978
    73386979class Import < Node
    7339 # @b_reuse::bool:       å†åˆ©ç”¨ï¼Žã‚»ãƒ«ã‚¿ã‚¤ãƒ—の template 生成不要
    7340 # @b_reuse_real::bool:  実際に再利用
    7341 # @cdl::      string:   import する CDL
    7342 # @cdl_path:: string:   CDL のパス
    7343 # @b_imported:: bool:   import された(コマンドライン指定されていない)
    7344 
    7345   # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
     6980# @b_reuse::bool:       再利用.セルタイプの template 生成不要
     6981# @b_reuse_real::bool:  実際に再利用
     6982# @cdl::      string:   import する CDL
     6983# @cdl_path:: string:   CDL のパス
     6984# @b_imported:: bool:   import された(コマンドライン指定されていない)
     6985
     6986  # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
    73466987  @@import_list = {}
    73476988
     
    73647005  end
    73657006
    7366   #=== Import# import を行う
    7367   #cdl::      string   cdl へのパス."" で囲まれていることを仮定
    7368   #b_reuse::  bool     true: template を生成しない
     7007  #=== Import# import を行う
     7008  #cdl::      string   cdl へのパス."" で囲まれていることを仮定
     7009  #b_reuse::  bool     true: template を生成しない
    73697010  def initialize( cdl, b_reuse = false, b_imported = true )
    73707011    Import.push self
     
    73727013    super()
    73737014    @@current_import = self
    7374     # ヘッダファイル名文字列から前後の "", <> を取り除くn
     7015    # ヘッダファイル名文字列から前後の "", <> を取り除くn
    73757016    @cdl = cdl.to_s.gsub( /\A["<](.*)[">]\z/, '\1' )
    73767017
    7377     # サーチパスから探す
     7018    # サーチパスから探す
    73787019    found = false
    73797020    @cdl_path = ""
     
    73837024
    73847025    if Generator.get_plugin then
    7385       # plugin から import されている場合 gen をサーチパスのå
    7386 ˆé ­ã«åŠ ãˆã‚‹
     7026      # plugin から import されている場合 gen をサーチパスの先頭に加える
    73877027      search_path = [ $gen ] + $import_path
    73887028    else
     
    73997039        end
    74007040
    7401         # ファイルの stat を取ってみる(なければ例外発生)
     7041        # ファイルの stat を取ってみる(なければ例外発生)
    74027042        File.stat( cdl_path )
    74037043
    7404         # cdl を見つかったファイルパスに再設定
     7044        # cdl を見つかったファイルパスに再設定
    74057045        @cdl_path = cdl_path
    74067046        found = true
     
    74197059    end
    74207060
    7421     # 読込み済みなら、読込まない
     7061    # 読込み済みなら、読込まない
    74227062    prev = @@import_list[ File.expand_path( @cdl_path ) ]
    74237063    if( prev ) then
     
    74287068    end
    74297069
    7430     # import リストを記録
     7070    # import リストを記録
    74317071    @@import_list[ File.expand_path( @cdl_path ) ] = self
    74327072
    7433     # plugin から import されている場合
     7073    # plugin から import されている場合
    74347074    plugin = Generator.get_plugin
    74357075
    7436     # パーサインスタンスを生成(別パーサで読み込む)
     7076    # パーサインスタンスを生成(別パーサで読み込む)
    74377077    parser = Generator.new
    74387078
    7439     # plugin から import されている場合の plugin 設定
     7079    # plugin から import されている場合の plugin 設定
    74407080    parser.set_plugin plugin
    74417081
    7442     # reuse フラグを設定
     7082    # reuse フラグを設定
    74437083    parser.set_reuse @b_reuse_real
    74447084
    7445     # cdl をパース
     7085    # cdl をパース
    74467086    parser.parse( [@cdl_path] )
    74477087
    7448     # 終期化 パーサスタックを戻す
     7088    # 終期化 パーサスタックを戻す
    74497089    parser.finalize
    74507090    Import.pop
     
    74717111  end
    74727112
    7473   #=== cdl の名前を返す
    7474   # 引数で指定されている cdl 名。一部パスを含む可能性がある
     7113  #=== cdl の名前を返す
     7114  # 引数で指定されている cdl 名。一部パスを含む可能性がある
    74757115  def get_cdl_name
    74767116    @cdl
     
    74787118end
    74797119
    7480 #== generate: signature プラグインのロードと実行
     7120#== generate: signature プラグインのロードと実行
    74817121class Generate < Node
    74827122#@plugin_name:: Symbol
    74837123#@signature_nsp:: NamespacePath
    7484 #@option::         String '"', '"' で囲まれている
     7124#@option::         String '"', '"' で囲まれている
    74857125
    74867126  include PluginModule
     
    74907130    @plugin_name = plugin_name
    74917131    @signature_nsp = signature_nsp
    7492     option = option.to_s    # option は Token
     7132    option = option.to_s    # option Token
    74937133    @option = option
    74947134
     
    75117151
    75127152    begin
    7513       eval( eval_str )     # plugin を生成
     7153      eval( eval_str )     # plugin を生成
    75147154      plugin_object.set_locale @locale
    75157155    rescue Exception => evar
     
    75237163end
    75247164
    7525 #== 名前空間パス
     7165#== 名前空間パス
    75267166class NamespacePath < Node
    75277167#@b_absolute::Bool
    75287168#@path::[ Symbol,... ]
    7529 #@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
     7169#@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
    75307170
    75317171  #=== NamespacePath# initialize
    7532   #ident::Symbol           æœ€åˆã®åå‰, ただし "::" のみの場合は String
    7533   #b_absolute:Bool         "::" で始まっている場合 true
    7534   #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、å¿
    7535 ãšæŒ‡å®šã™ã‚‹ã“と
     7172  #ident::Symbol           最初の名前, ただし "::" のみの場合は String
     7173  #b_absolute:Bool         "::" で始まっている場合 true
     7174  #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、必ず指定すること
    75367175  def initialize( ident, b_absolute, namespace = nil )
    75377176    super()
     
    75597198  end
    75607199
    7561   #=== NamespacePath# append する
     7200  #=== NamespacePath# append する
    75627201  #RETURN self
    7563   # このメソッドは、å
    7564 ƒã® NamespacePath オブジェクトを変形して返す
     7202  # このメソッドは、元の NamespacePath オブジェクトを変形して返す
    75657203  def append!( ident )
    75667204    @path << ident
    75677205    return self
    75687206  end
    7569   #=== NamespacePath# append する
    7570   # このメソッドは、å
    7571 ƒã® NamespacePath オブジェクトを変形しない
    7572   #RETURN:: 複製した NamespacePath
     7207  #=== NamespacePath# append する
     7208  # このメソッドは、元の NamespacePath オブジェクトを変形しない
     7209  #RETURN:: 複製した NamespacePath
    75737210  def append( ident )
    75747211    cl = self.clone
     
    75867223  end
    75877224
    7588   #=== NamespacePath#クローンを作成して名前を変更する
     7225  #=== NamespacePath#クローンを作成して名前を変更する
    75897226  def change_name name
    75907227    cl = self.clone
     
    75957232  alias :change_name_clone :change_name
    75967233
    7597   #=== NamespacePath#名前を変更する
    7598   # このインスタンスを参ç
    7599 §ã™ã‚‹ã™ã¹ã¦ã«å½±éŸ¿ã‚’与えることに注意
     7234  #=== NamespacePath#名前を変更する
     7235  # このインスタンスを参照するすべてに影響を与えることに注意
    76007236  def change_name_no_clone name
    76017237    @path[ @path.length - 1 ] = name
     
    76037239  end
    76047240
    7605   #=== NamespacePath:: path 文字列を得る
    7606   # CDL 用の path 文字列を生成
     7241  #=== NamespacePath:: path 文字列を得る
     7242  # CDL 用の path 文字列を生成
    76077243  def to_s
    76087244    get_path_str
     
    76337269  end
    76347270
    7635   #=== NamespacePath:: パスのé
    7636 åˆ—を返す
    7637   # is_absolute? true の場合、ルートからのパス
    7638   #              false の場合、base_namespace からの相対
    7639   # ルート namespace の場合、長さ0のé
    7640 åˆ—を返す
     7271  #=== NamespacePath:: パスの配列を返す
     7272  # is_absolute? true の場合、ルートからのパス
     7273  #              false の場合、base_namespace からの相対
     7274  # ルート namespace の場合、長さ0の配列を返す
    76417275  #
    76427276  def get_path
     
    76447278  end
    76457279
    7646   #=== NamespacePath#フルパスのé
    7647 åˆ—を返す
    7648   # 返されたé
    7649 åˆ—を書き換えてはならない
     7280  #=== NamespacePath#フルパスの配列を返す
     7281  # 返された配列を書き換えてはならない
    76507282  def get_full_path
    76517283    if @b_absolute then
     
    76567288  end
    76577289
    7658   #=== NamespacePath:: 相対パスのベースとなる namespace
    7659   # is_absolute? == false の時のみ有効な値を返す (true なら nil)
     7290  #=== NamespacePath:: 相対パスのベースとなる namespace
     7291  # is_absolute? == false の時のみ有効な値を返す (true なら nil)
    76607292  def get_base_namespace
    76617293    @namespace
    76627294  end
    76637295
    7664   #=== NamespacePath:: C 言語グローバル名を得る
     7296  #=== NamespacePath:: C 言語グローバル名を得る
    76657297  def get_global_name
    76667298    if @b_absolute then
     
    76807312  end
    76817313
    7682   #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
    7683   #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
    7684   #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
     7314  #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
     7315  #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
     7316  #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
    76857317  #
    7686   # NamespacePath は通常構文解析されて作成される
    7687   # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
    7688   # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
     7318  # NamespacePath は通常構文解析されて作成される
     7319  # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
     7320  # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
    76897321  def self.analyze( path_str, b_force_absolute = false )
    76907322
     
    77257357end
    77267358
    7727 # 以下単体テストコード
     7359# 以下単体テストコード
    77287360if $unit_test then
    77297361  root_namespace = Namespace.new("::")
Note: See TracChangeset for help on using the changeset viewer.