- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- 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
totext/x-ruby;charset=UTF-8
r270 r321 6 6 # Copyright (C) 2008-2016 by TOPPERS Project 7 7 #-- 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 # 免責すること. 44 30 # 45 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 # ã®è²¬ä»»ãè² ããªãï¼ 31 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 # の責任を負わない. 51 36 # 52 # $Id : componentobj.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 55 40 # 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 のものが共有される(別にしたかった) 68 50 # class Nestable 69 51 # @@nest_stack_index = -1 … … 90 72 # @name:: Symbol 91 73 # @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: 空(関数が一つもない状態) 101 81 102 82 @@nest_stack_index = -1 … … 119 99 120 100 # STAGE: P 121 # ãã®ã¡ã½ãã㯠parse ä¸ã®ã¿å¼ã³åºããã101 # このメソッドは parse 中のみ呼び出される 122 102 def self.get_current 123 103 @@current_object … … 130 110 @name = name 131 111 Namespace.new_signature( self ) 132 set_namespace_path # @NamespacePath ã®è¨å®112 set_namespace_path # @NamespacePath の設定 133 113 if "#{Namespace.get_global_name}" == "" then 134 114 @global_name = @name … … 152 132 @function_head_list = function_head_list 153 133 154 # id ãå²ä»ãã134 # id を割付ける 155 135 id = 1 156 136 function_head_list.get_items.each{ |f| … … 166 146 end 167 147 168 #=== Signature# signature ã®æå®åãè¨å®148 #=== Signature# signature の指定子を設定 169 149 # STAGE: B 170 150 #spec_list:: [ [ :CONTEXT, String ], ... ] 171 151 # s[0] s[1] 172 152 def set_specifier_list( spec_list ) 173 return if spec_list == nil # 空ãªãã°ä½ãããªã153 return if spec_list == nil # 空ならば何もしない 174 154 175 155 spec_list.each { |s| … … 216 196 end 217 197 218 #=== Signature# é¢æ°åãã signature å 219 ã® id ãå¾ã 198 #=== Signature# 関数名から signature 内の id を得る 220 199 def get_id_from_func_name func_name 221 200 @func_name_to_id[ func_name ] 222 201 end 223 202 224 #=== Signature# context ãå¾ã225 # context æååãè¿ã"task", "non-task", "any"226 # æªæå®æã®ããã©ã«ãã¨ã㦠task ãè¿ã203 #=== Signature# context を得る 204 # context 文字列を返す "task", "non-task", "any" 205 # 未指定時のデフォルトとして task を返す 227 206 def get_context 228 207 if @context then … … 233 212 end 234 213 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| # すべてのパラメータについて 251 227 pr.call( fd, par ) 252 228 } … … 255 231 end 256 232 257 #=== Signature# æ£å½ãªã¢ãã±ã¼ã¿ ã·ã°ããã£ããã¹ããã258 # alloc, dealloc é¢æ°ãæã¤ãã©ããã第ä¸å¼ãæ°ããããããæ´æ°ããã¤ã³ã¿ã第äºå¼ãæ°ãããã¤ã³ã¿ã¸ã®ãã¤ã³ã¿ããªã233 #=== Signature# 正当なアロケータ シグニチャかテストする 234 # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし 259 235 def is_allocator? 260 236 261 # ä¸åã ããã§ãã¯ãã237 # 一回だけチェックする 262 238 if @b_checked_as_allocator_signature == true then 263 239 return true … … 265 241 @b_checked_as_allocator_signature = true 266 242 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 なら文法エラーで有効値が設定されなかった 270 245 return false 271 246 end 272 247 273 248 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 が関数でなければ、すでにエラー 278 252 func_name = fd.get_name.to_sym 279 253 if func_name == :alloc then … … 284 258 ! params[0].get_type.get_original_type.kind_of?( IntType ) || 285 259 params[0].get_direction != :IN then 286 # 第ä¸å¼æ°ã int åã§ãªã260 # 第一引数が int 型でない 287 261 if ! params[0].instance_of?( ParamDecl ) || 288 262 ! params[0].get_type.kind_of?( PtrType ) || … … 290 264 params[0].get_type.get_type.get_type.kind_of?( PtrType ) || 291 265 params[0].get_direction != :OUT then 292 # 第ä¸å¼æ°ããã¤ã³ã¿åã§ããªã266 # 第一引数がポインタ型でもない 293 267 cdl_error3( @locale, "S1003 $1: \'alloc\' 1st parameter neither [in] integer type nor [out] double pointer type", @name ) 294 268 end … … 298 272 params[1].get_type.get_type.get_type.kind_of?( PtrType ) || 299 273 params[0].get_direction != :IN then 300 # ( 第ä¸å¼æ°ãæ´æ°ã§) 第äºå¼æ°ããã¤ã³ã¿ã§ãªã274 # (第一引数が整数で) 第二引数がポインタでない 301 275 cdl_error3( @locale, "S1004 $1: \'alloc\' 2nd parameter not [in] double pointer" , @name ) 302 276 end … … 313 287 params[0].get_direction != :IN then 314 288 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 # 第二引き数はチェックしない 316 290 # cdl_error3( @locale, "S1007 Error message is changed to empty" ) 317 291 # cdl_error3( @locale, "S1007 $1: \'dealloc\' cannot has 2nd parameter" , @name ) … … 335 309 end 336 310 337 #== Signature# å¼æ°ã§åç 338 §ããã¦ãã Descriptor åã®ãªã¹ããä½æãã 339 #RETURN:: Hash { Signature => ParamDecl }: è¤æ°ã® ParamDecl ããåç 340 §ããã¦ããå ´åãæå¾ã®ãã®ããè¿ããªã 311 #== Signature# 引数で参照されている Descriptor 型のリストを作成する 312 #RETURN:: Hash { Signature => ParamDecl }: 複数の ParamDecl から参照されている場合、最後のものしか返さない 341 313 def get_descriptor_list 342 314 desc_list = { } 343 315 # 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 の場合、自己参照によるケースと仮定 348 318 return desc_list 349 319 end 350 320 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 が関数でなければ、すでにエラー 353 323 params = fd.get_type.get_paramlist.get_items 354 324 if params then … … 369 339 end 370 340 371 #=== Signature# å¼æ°ã« Descriptor ããããï¼341 #=== Signature# 引数に Descriptor があるか? 372 342 def has_descriptor? 373 343 # 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 の場合、自己参照によるケースと仮定 378 346 return true 379 347 end 380 348 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 が関数でなければ、すでにエラー 383 351 params = fd.get_type.get_paramlist.get_items 384 352 if params then … … 399 367 end 400 368 401 #=== Signature# ã³ã¼ã«ããã¯ãï¼402 # æå®å callback ãæå®ããã¦ããã°true369 #=== Signature# コールバックか? 370 # 指定子 callback が指定されていれば true 403 371 def is_callback? 404 372 @b_callback 405 373 end 406 374 407 #=== Signature# é¸è±ãï¼408 # æå®å deviate ãæå®ããã¦ããã°true375 #=== Signature# 逸脱か? 376 # 指定子 deviate が指定されていれば true 409 377 def is_deviate? 410 378 @b_deviate 411 379 end 412 380 413 #=== Signature# 空ãï¼381 #=== Signature# 空か? 414 382 def is_empty? 415 383 @b_empty 416 384 end 417 385 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 のいずれかで修飾)がある 422 388 def need_PPAllocator?( b_opaque = false ) 423 fha = get_function_head_array # å¼ã³å£ã¾ãã¯åãå£ã®ã·ã°ããã£ã®é¢æ°é 424 å 389 fha = get_function_head_array # 呼び口または受け口のシグニチャの関数配列 425 390 fha.each{ |fh| 426 391 fd = fh.get_declarator … … 457 422 # @factory_list:: Factory[] 458 423 # @ct_factory_list:: Factory[] : celltype factory 459 # @cell_list:: Cell[] : å®ç¾©ã®ã¿ (V1.0.0.2 以é)424 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降) 460 425 # @singleton:: bool 461 426 # @idx_is_id:: bool 462 427 # @idx_is_id_act:: bool: actual value 463 428 # @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 は生成後に追加される 466 431 # 467 432 # @n_attribute_ro:: int >= 0 none specified … … 470 435 # @n_var:: int >= 0 471 436 # @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 は有? 473 438 # @n_var_init:: int >= 0 # of vars with initializer 474 439 # @n_call_port:: int >= 0 475 440 # @n_call_port_array:: int >= 0 476 # @n_call_port_omitted_in_CB:: int >= 0 æé©åã§çç¥ãããå¼ã³å£441 # @n_call_port_omitted_in_CB:: int >= 0 最適化で省略される呼び口 477 442 # @n_entry_port:: int >= 0 478 443 # @n_entry_port_array:: int >= 0 479 444 # @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) 483 447 # 484 # @b_cp_optimized:: bool : å¼ã³å£æé©åå®æ½485 # @plugin:: PluginObject ãã®ã»ã«ã¿ã¤ãããã©ã°ã¤ã³ã«ããçæããã CDL ããçæãããå ´åã«æå¹ã486 # generate ã®æå®ã¯ @generate ã«ãã©ã°ã¤ã³ãä¿æããã448 # @b_cp_optimized:: bool : 呼び口最適化実施 449 # @plugin:: PluginObject このセルタイプがプラグインにより生成された CDL から生成された場合に有効。 450 # generate の指定は @generate にプラグインが保持される 487 451 # 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 492 455 493 456 include PluginModule … … 553 516 554 517 @plugin = Generator.get_plugin 555 # plugin ã®å ´å PluginObject ãè¿ããã 556 # å 557 ã® Generator ããå¼åºããã Generator ã®ä¸ã§ãã¼ã¹ããã³æå³ãã§ãã¯ããã¦ãã 518 # plugin の場合 PluginObject が返される 519 # 元の Generator から呼出された Generator の中でパースおよび意味チェックされている 558 520 559 521 # if @plugin then 560 # # plugin çæãããã»ã«ã¿ã¤ãã¯åå©ç¨ã§ã¯ãªã #833 ä¸å 561 ·åä¿®æ£ 522 # # plugin 生成されるセルタイプは再利用ではない #833 不具合修正 562 523 # @b_reuse = false 563 524 # else … … 573 534 574 535 Namespace.new_celltype( self ) 575 set_namespace_path # @NamespacePath ã®è¨å®536 set_namespace_path # @NamespacePath の設定 576 537 set_specifier_list( Generator.get_statement_specifier ) 577 538 … … 589 550 end 590 551 591 #== Celltype#ãã¡ã¤ã³ã«ã¼ããè¿ã 592 # @domain_roots ã®èª¬æãåç 593 § 552 #== Celltype#ドメインルートを返す 553 # @domain_roots の説明を参照 594 554 def get_domain_roots 595 555 @domain_roots … … 598 558 # Celltype# end_of_parse 599 559 def end_of_parse 600 # å±æ§ã»å¤æ°ã®ãã§ãã¯560 # 属性・変数のチェック 601 561 check_attribute 602 562 603 # ã¢ãã±ã¼ã¿å¼ã³å£ãå 604 é¨çæ 563 # アロケータ呼び口を内部生成 605 564 generate_allocator_port 606 565 607 # ãªã¬ã¼ã¢ãã±ã¼ã¿ãå 608 é¨ã¢ãã±ã¼ã¿ã®è¨å® 566 # リレーアロケータ、内部アロケータの設定 609 567 @port.each { |p| 610 568 p.set_allocator_instance … … 666 624 end 667 625 if a.get_initializer then 668 # ç»é²å¾ã«ãã§ãã¯ãã¦ãåé¡ãªãï¼attr ãåç 669 §ã§ããªãã®ã§ãèªå·±åç 670 §ããªãï¼ 626 # 登録後にチェックしても問題ない(attr を参照できないので、自己参照しない) 671 627 a.get_type.check_init( @locale, a.get_identifier, a.get_initializer, :ATTRIBUTE ) 672 628 end … … 674 630 end 675 631 676 #=== Celltype# celltype ã® attribute/var ã®ãã§ãã¯632 #=== Celltype# celltype の attribute/var のチェック 677 633 # STAGE: S 678 634 # 679 # ãã®ã¡ã½ãã㯠celltype ã®ãã¼ã¹ãå®äºããæç¹ã§å¼åºãããï¼635 # このメソッドは celltype のパースが完了した時点で呼出される. 680 636 def check_attribute 681 # attribute ã® size_is æå®ã妥å½ããã§ãã¯637 # attribute の size_is 指定が妥当かチェック 682 638 (@attribute+@var).each{ |a| 683 639 if a.get_size_is then 684 640 if ! a.get_type.kind_of?( PtrType ) then 685 # size_is ããã¤ã³ã¿å以å¤ã«æå®ããã641 # size_is がポインタ型以外に指定された 686 642 cdl_error( "S1011 $1: size_is specified for non-pointer type" , a.get_identifier ) 687 643 else 688 644 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 の可能性あり 692 647 init = a.get_initializer 693 648 if init then 694 649 if ! init.instance_of?( Array ) then 695 # åæååãé 696 åã§ã¯ãªã 650 # 初期化子が配列ではない 697 651 cdl_error( "S1012 $1: unsuitable initializer, need array initializer" , a.get_identifier ) 698 652 elsif size.kind_of?( Integer ) && size < init.length then 699 # size_is æå®ãããåæ°ãããåæååã®é 700 åè¦ç´ ãå¤ã 653 # size_is 指定された個数よりも初期化子の配列要素が多い 701 654 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 の可能性あり 703 656 end 704 657 … … 710 663 ( a.get_initializer.instance_of?( Expression ) && 711 664 a.get_initializer.eval_const2(@name_list).instance_of?( Array ) ) then 712 # size_is æå®ããã¦ããªããã¤ã³ã¿ã Array ã§åæåããã¦ããããã¨ã©ã¼665 # size_is 指定されていないポインタが Array で初期化されていたら、エラー 713 666 cdl_error( "S1159 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier ) 714 667 end … … 722 675 end 723 676 724 #=== Celltype# ã¢ãã±ã¼ã¿å¼ã³å£ãçæ725 # send, receive å¼æ°ã®ã¢ãã±ã¼ã¿ãå¼åºãããã®å¼ã³å£ãçæ677 #=== Celltype# アロケータ呼び口を生成 678 # send, receive 引数のアロケータを呼出すための呼び口を生成 726 679 def generate_allocator_port 727 680 @port.each { |port| 728 # ãã¼ãã®ãã¹ã¦ã®ãã©ã¡ã¼ã¿ã辿ã681 # ポートのすべてのパラメータを辿る 729 682 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 ) 731 684 when :SEND, :RECEIVE 732 685 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 ã¢ãã±ã¼ã¿å¼ã³å£ã®ã·ã°ããã£#1686 cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}" # アロケータ呼び口の名前 687 # ポート名 関数名 パラメータ名 688 # alloc_sig_path = [ par.get_allocator.get_name ] # mikan Namespace アロケータ呼び口のシグニチャ #1 736 689 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 ) # 呼び口を生成 740 692 created_port.set_allocator_port( port, fd, par ) 741 693 if port.is_optional? then … … 745 697 created_port.set_omit 746 698 end 747 new_port( created_port ) # ã»ã«ã¿ã¤ãã«æ°ããå¼ã³å£ã追å699 new_port( created_port ) # セルタイプに新しい呼び口を追加 748 700 # else 749 701 # already error "not found or not signature" in class ParamDecl … … 762 714 end 763 715 764 #=== Celltype# æ°ããå 765 é¨å¤æ° 716 #=== Celltype# 新しい内部変数 766 717 #var:: [Decl] 767 718 def new_var( var ) … … 776 727 @name_list.add_item( i ) 777 728 778 # size_is æå®ãããé 779 å? mikan count_is 729 # size_is 指定された配列? mikan count_is 780 730 if i.get_size_is then 781 731 @n_var_size_is += 1 … … 793 743 end 794 744 795 #=== Celltype# celltype ã®æå®åãè¨å®745 #=== Celltype# celltype の指定子を設定 796 746 def set_specifier_list( spec_list ) 797 747 return if spec_list == nil … … 822 772 823 773 def new_require( ct_or_cell_nsp, ep_name, cp_name ) 824 # Require: set_owner ãããã®ããªã774 # Require: set_owner するものがない 825 775 obj = Namespace.find( ct_or_cell_nsp ) #1 826 776 if obj.instance_of? Celltype then 827 # Celltype åã§æå®777 # Celltype 名で指定 828 778 ct = obj 829 779 elsif obj.instance_of? Cell then 830 # Cell åã§æå®780 # Cell 名で指定 831 781 ct = obj.get_celltype 832 782 elsif obj == nil then … … 839 789 840 790 if( ! ct.is_singleton? ) then 841 # ã·ã³ã°ã«ãã³ã§ã¯ãªã791 # シングルトンではない 842 792 cdl_error( "S1018 $1 : not singleton cell" , obj.get_name ) 843 793 end 844 794 845 # åãå£ãæ¢ã795 # 受け口を探す 846 796 obj2 = ct.find( ep_name ) 847 797 if( ( ! obj2.instance_of? Port ) || obj2.get_port_type != :ENTRY ) then … … 854 804 855 805 if obj2.get_signature == nil then 856 # signature ãæªå®ç¾©ï¼æ¢ã«ã¨ã©ã¼806 # signature が未定義:既にエラー 857 807 return 858 808 end … … 860 810 require_call_port_prefix = :_require_call_port 861 811 if cp_name == nil then 862 # é¢æ°åéè¤ãã§ãã¯812 # 関数名重複チェック 863 813 @require.each{ |req| 864 814 unless req[0].to_s =~ /^#{require_call_port_prefix}/ then 865 next # ååããã® require ã¯é¢æ°åéè¤ãã§ãã¯ããªã815 next # 名前ありの require は関数名重複チェックしない 866 816 end 867 817 port = req[2] 868 818 if port.get_signature == obj2.get_signature then 869 # åã signature ï¼ãã¹ã¦åãé¢æ°åãæã¤ï¼åå¥ã«åºãã®ã§ã¯ãªããã¾ã¨ãã¦ã¨ã©ã¼ã¨ãã819 # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする 870 820 cdl_error( "S1021 $1 : require cannot have same signature with \'$2\'" , obj2.get_name, port.get_name ) 871 821 next 872 822 end 873 823 port.get_signature.get_function_head_array.each{ |f| 874 # mikan ããã¯ãnamedList ããã®æ¤ç´¢ã«ãªããªãã®ï¼ï¼å¹çãæªãï¼824 # mikan ここは、namedList からの検索にならないの?(効率が悪い) 875 825 obj2.get_signature.get_function_head_array.each{ |f2| 876 826 if( f.get_name == f2.get_name ) then … … 888 838 b_has_name = true 889 839 end 890 # require ã追å840 # require を追加 891 841 @require << [ cp_name, obj, obj2 ] # [ lhs:cp_name, rhs:Celltype, rhs:Port ] 892 842 893 # require port ã追å (å¼ã³å£ã¨ãã¦è¿½å ããããã ã require ãã»ãããã¦ãã)843 # require port を追加 (呼び口として追加する。ただし require をセットしておく) 894 844 port = Port.new( cp_name, obj2.get_signature.get_namespace_path, :CALL ) 895 845 port.set_require( b_has_name ) … … 913 863 end 914 864 915 #=== Celltype# ã»ã«ã¿ã¤ããã©ã°ã¤ã³ (generate æå®å)865 #=== Celltype# セルタイププラグイン (generate 指定子) 916 866 def celltype_plugin 917 867 … … 927 877 928 878 begin 929 eval( eval_str ) # plugin ãçæ879 eval( eval_str ) # plugin を生成 930 880 plugin_object.set_locale @locale 931 881 @generate[ 2 ] = plugin_object … … 939 889 end 940 890 941 #=== Celltype# celltype ã«æ°ãã cell ã追å891 #=== Celltype# celltype に新しい cell を追加 942 892 #cell:: Cell 943 # æ°ããã»ã«ãã»ã«ã¿ã¤ãã«è¿½å ï¼944 # ã»ã«ã®æ§æ解éã®æå¾ã§ãã®ã¡ã½ããå¼åºãããï¼945 # ã·ã³ã°ã«ãã³ã»ã«ãåã linkunit ã«è¤æ°ãªãããã§ãã¯893 # 新しいセルをセルタイプに追加. 894 # セルの構文解釈の最後でこのメソドを呼出される. 895 # シングルトンセルが同じ linkunit に複数ないかチェック 946 896 def new_cell( cell ) 947 # Celltype ã§ã¯ Cell ã® set_owner ããªã948 # ã·ã³ã°ã«ãã³ã§ããããã¿ã¤ã宣è¨ã§ãªãå ´åãã³ã¼ãçæ対象ãªã¼ã¸ã§ã³ã®å ´å897 # Celltype では Cell の set_owner しない 898 # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合 949 899 if @singleton then 950 900 @cell_list.each{ |c| … … 960 910 end 961 911 962 #=== Celltype# ã»ã«ã¿ã¤ã㯠INIB ãæã¤ãï¼963 # ã»ã«ã¿ã¤ãã INIB ãæã¤ãã©ãããå¤å®ãã964 # $rom == false ã®ã¨ã: INIB ãæããªãï¼ ï¼ãã¹ã¦ã¯ CB ã«ç½®ãããï¼965 # $rom == true ã®ã¨ããINIB ã«ç½®ããããã®ãä¸ã¤ã§ãåå¨ããã° INIB ãæã¤966 # INIB ã«ç½®ããããã®ã¯967 # attribute (omit ã®ãã®ã¯é¤ãï¼ç¾ä»æ§ã§ã¯ rw ã®ãã®ã¯ãªã)968 # size_is ãä¼´ãvar969 # å¼ã³å£ï¼ãã ããæé©åã§ä¸è¦ã¨ãªããã®ã¯é¤ãï¼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 # 呼び口(ただし、最適化で不要となるものは除く) 970 920 def has_INIB? 971 921 # 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" … … 974 924 end 975 925 976 #=== Celltype# ã»ã«ã¿ã¤ã㯠CB ãæã¤ãï¼977 # $rom == true ã®ã¨ããããã®ãã®ãç½®ãããï¼ãããã®ä¸ã¤ã§ãåå¨ããã° CB ãæã¤978 # size_is ãæå®ããã¦ããªãvar979 # rw æå®ããã attribute (ç¾ä»æ§ã§ã¯åå¨ããªã)980 # $rom == false ã®ã¨ããããã®ãã®ãç½®ãããï¼ãããã®ä¸ã¤ã§ãåå¨ããã° CB ãæã¤926 #=== Celltype# セルタイプは CB を持つか? 927 # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ 928 # size_is が指定されていない var 929 # rw 指定された attribute (現仕様では存在しない) 930 # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ 981 931 # attribute 982 932 # var 983 # å¼ã³å£ï¼ãã ããæé©åã§ä¸è¦ã¨ãªããã®ã¯é¤ãï¼933 # 呼び口(ただし、最適化で不要となるものは除く) 984 934 def has_CB? 985 935 if $rom then … … 991 941 end 992 942 993 #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB ãå¿ 994 è¦ã 943 #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB が必要か 995 944 def need_CB_initializer? 996 945 @n_var_init > 0 || has_CB? 997 946 end 998 947 999 #=== Celltype# érequire ã®çµåãçæãã948 #=== Celltype# 逆require の結合を生成する 1000 949 def create_reverse_require_join cell 1001 950 @port.each{ |p| … … 1004 953 end 1005 954 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 を探す必要がある 1011 959 def get_singleton_cell region 1012 960 cell = nil 1013 dist = 999999999 # mikan å¶éå¤ï¼ããã¯ååãããã»ã©ãã«ã¤ãï¼1014 # require: celltype ã§æå®961 dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが) 962 # require: celltype で指定 1015 963 @cell_list.each{ |c| 1016 # å°éå¯è½ã§æãè¿ãã»ã«ãæ¢ãï¼è¤æ°ã® singleton ããããããããªãï¼964 # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない) 1017 965 d = region.distance( c.get_region ) 1018 966 #debug … … 1033 981 end 1034 982 1035 #=== Celltype# ã»ã«ã¿ã¤ããã©ã°ã¤ã³ãå¾ã983 #=== Celltype# セルタイププラグインを得る 1036 984 def get_celltype_plugin 1037 985 if @generate then … … 1052 1000 end 1053 1001 1054 #=== Celltype# ã¢ã¯ãã£ãã§ã¯ãªãã1055 # ãã®ã¡ã½ããã§ã¯ active ã®ä»ã« factory (singleton ã«ããã¦ã¯ FACTORYãå«ã)ããªããã° inactive ã¨ãã1002 #=== Celltype# アクティブではないか 1003 # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする 1056 1004 def is_inactive? 1057 1005 if @active == false && @factory_list.length == 0 && … … 1074 1022 end 1075 1023 1076 #=== Celltype# ã³ã¼ãçæããå¿ 1077 è¦ããããå¤å® 1078 # ã»ã«ã®åæ°ã 0 ãªãã»ã«ã¿ã¤ãã³ã¼ãã¯çæä¸è¦ 1024 #=== Celltype# コード生成する必要があるか判定 1025 # セルの個数が 0 ならセルタイプコードは生成不要 1079 1026 def need_generate? 1080 1027 @n_cell_gen > 0 1081 1028 end 1082 1029 1083 #=== Celltype# require å¼ã³å£ã®çµåãè¡ã1030 #=== Celltype# require 呼び口の結合を行う 1084 1031 # STAGE: S 1085 # ã»ã«ã¿ã¤ãã® require å¼ã³å£ã«ã¤ãã¦ãçµåãè¡ã1086 # ã»ã«ãçæãããªãããã§ãã¯ãè¡ã1032 # セルタイプの require 呼び口について、結合を行う 1033 # セルが生成されないかチェックを行う 1087 1034 def set_require_join 1088 1035 @require.each{ |req| … … 1100 1047 end 1101 1048 1102 #=== Celltype# inline åãå£ãããªããï¼1103 # åãå£ãç¡ãå ´åããã¹ã¦ã®åãå£ã inline ã¨ã¯ããªã1049 #=== Celltype# inline 受け口しかないか? 1050 # 受け口が無い場合、すべての受け口が inline とはしない 1104 1051 def is_all_entry_inline? 1105 1052 @n_entry_port == @n_entry_port_inline && @n_entry_port > 0 … … 1140 1087 # @n_var:: int >= 0 1141 1088 # @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 は有? 1143 1090 # @n_call_port:: int >= 0 1144 1091 # @n_call_port_array:: int >= 0 1145 # @n_call_port_omitted_in_CB:: int >= 0 æé©åã§çç¥ãããå¼ã³å£1092 # @n_call_port_omitted_in_CB:: int >= 0 最適化で省略される呼び口 1146 1093 # @n_entry_port:: int >= 0 1147 1094 # @n_entry_port_array:: int >= 0 1148 1095 (indent+1).times { print " " } 1149 1096 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) 1153 1099 1154 1100 end … … 1156 1102 1157 1103 class 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 1162 1107 # @celltype:: Celltype | CompositeCelltype 1163 1108 # @join_list:: NamedList … … 1166 1111 # @b_prototype:: bool: prototype specified in current parsing cell. (@b_defined is used to determine whether definition done) 1167 1112 # @b_duplicate:: bool: definition duplicate 1168 # @b_checked:: bool: set_definition_join ãæ¸ãã§ããå ´åtrue1169 # @require_joined_list:: {cp_name=>true}: set_require_join ãæ¸ãã§ããå¼ã³å£ã¯true1113 # @b_checked:: bool: set_definition_join が済んでいる場合 true 1114 # @require_joined_list:: {cp_name=>true}: set_require_join が済んでいる呼び口は true 1170 1115 # @f_ref:: refercenced from others 1171 # @entry_array_max_subscript:: { @port=>Integer } : åãå£é 1172 åã®é 1173 åæ·»æ°ã®æ大å¤ï¼æ·»æ°ç¡ãåãå£é 1174 å対å¿ï¼ 1116 # @entry_array_max_subscript:: { @port=>Integer } : 受け口配列の配列添数の最大値(添数無し受け口配列対応) 1175 1117 # @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 は生成後に追加される 1181 1122 # 1182 # composite ã®ããã¤ã³ã¹ã¿ã³ã¹å¤æ°1123 # composite のためインスタンス変数 1183 1124 # @in_composite:: bool : true if in composite celltype 1184 1125 # @compositecelltypejoin_list:: NamedList : item= CompositeCelltypeJoin ( if @in_composite ) 1185 1126 # @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 内での出現順 1191 1131 # 1192 # region ã®ããã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°1193 # @region:: Region ( å±ããregion)1132 # region のためのインスタンス変数 1133 # @region:: Region (属するregion) 1194 1134 # 1195 # allocator ã®ããã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°1135 # allocator のためのインスタンス変数 1196 1136 # @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 … リレーアロケータの場合 1200 1140 # 1201 # ID ã®ããã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ï¼optimize.rb ã«ã¦è¨å®ï¼1202 # @id:: Integer : ã³ã¼ãçæç´åã«è¨å® (ãããã¿ã¤ã宣è¨ã®å ´å㯠-1 ã®ã¾ã¾æ¾ç½®)1203 # @id_specified::Integer : æå®ãããid1141 # ID のためのインスタンス変数(optimize.rb にて設定) 1142 # @id:: Integer : コード生成直前に設定 (プロトタイプ宣言の場合は -1 のまま放置) 1143 # @id_specified::Integer : 指定された id 1204 1144 # @restrict_list::{ entry_name => { func_name, [ region_name, ... ] } } 1205 1145 1206 1146 =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 セルタイプのセルもある 1213 1151 # 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 # ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも 1219 1156 # 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 する実装に変更する必要がある 1228 1161 # 1229 1162 =end … … 1235 1168 @@current_object = nil 1236 1169 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 にて設定される 1244 1174 1245 1175 def self.push … … 1258 1188 1259 1189 1260 # composite 㧠clone ããããã®ï¼åå«ã¾ã§å«ãï¼ 1261 # Join.change_rhs_port ã«ã¦ CompoisteCelltype å 1262 ã® Join ã®çµåå 1263 ãå¤æ´ããéã«ä½¿ç¨ 1190 # composite で clone されたもの(子孫まで含む) 1191 # Join.change_rhs_port にて CompoisteCelltype 内の Join の結合先を変更する際に使用 1264 1192 @@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 のセル名を前につなげるだけでよかった 1270 1195 1271 1196 def initialize( ct_path, in_composite = false ) … … 1273 1198 @region = Region.get_current 1274 1199 1275 # celltype ã®plugin/åå¨ããã§ãã¯1200 # celltype のplugin/存在をチェック 1276 1201 object = Namespace.find( ct_path ) #1 1277 1202 if object == nil then 1278 # mikan celltype ã®ååãä¸å®å 1279 ¨ "::ct1ct2" ã«ãªã 1203 # mikan celltype の名前が不完全 "::ct1ct2" になる 1280 1204 cdl_error( "S1027 \'$1\' celltype not found" , ct_path.get_path_str ) 1281 1205 elsif ! object.instance_of?( Celltype ) && ! object.instance_of?( CompositeCelltype ) then 1282 # mikan celltype ã®ååãä¸å®å 1283 ¨ 1206 # mikan celltype の名前が不完全 1284 1207 cdl_error( "S1028 \'$1\' not celltype" , ct_path.get_path_str ) 1285 1208 else … … 1329 1252 end 1330 1253 1331 # ãã®æç¹ã§ã¯ãããã¿ã¤ãããå®ç¾©ãåããªãããèªå·±åç 1332 §ã®ããã«ç»é² 1333 # set_f_def ã§å度ç»é²ããªãã 1334 # Celltype ã¸ã®ç»é²ã¯ãend_of_parse ã§è¡ã 1254 # この時点ではプロトタイプか、定義か分らないが、自己参照のために登録 1255 # set_f_def で再度登録しなおす 1256 # Celltype への登録は、end_of_parse で行う 1335 1257 if @in_composite then 1336 1258 cell_prev = CompositeCelltype.find( name ) … … 1339 1261 end 1340 1262 else 1341 # cell_prev = Namespace.find( [ name ] ) # 親ã¾ã§æãã«ãã1263 # cell_prev = Namespace.find( [ name ] ) # 親まで捜しにいく 1342 1264 cell_prev = Namespace.get_current.find( name ) 1343 1265 if cell_prev == nil then 1344 1266 Namespace.new_cell( self ) 1345 set_namespace_path # @NamespacePath ã®è¨å®1267 set_namespace_path # @NamespacePath の設定 1346 1268 end 1347 1269 end … … 1350 1272 if ! cell_prev.instance_of?( Cell ) then 1351 1273 cdl_error( "S1029 $1 mismatch with previous one" , name ) 1352 # celltype ãä¸è´ãã¦ããã?1274 # celltype が一致しているか ? 1353 1275 elsif get_celltype != cell_prev.get_celltype then 1354 1276 cdl_error( "S1030 $1: celltype mismatch with previous one" , name ) 1355 1277 else 1356 # region ãä¸è´ãã¦ããã?1278 # region が一致しているか? 1357 1279 if ! cell_prev.get_region.equal? get_region then 1358 1280 cdl_error( "S1031 $1 region \'$2\' mismatch with previous one \'$3\'" , name, @region.get_name, cell_prev.get_region.get_name ) … … 1360 1282 1361 1283 @@current_object = cell_prev 1362 # ãã®æç¹ã§ã¯ãã¾ã ãããã¿ã¤ã宣è¨ãå®ç¾©ãåããªã1363 # 以åãå®ç¾©ã§ãã£ã¦ãä»åãå®ç¾©ã®å ´åãéè¤ã¨ã©ã¼ã§ãã1284 # この時点では、まだプロトタイプ宣言か定義か分らない 1285 # 以前が定義であって、今回も定義の場合、重複エラーである 1364 1286 end 1365 1287 end … … 1371 1293 dbgPrint "Cell new_cell: #{@global_name} #{@in_composite} #{self}\n" 1372 1294 1373 # å 1374 é¨ã¢ãã±ã¼ã¿ã @alloc_list ã«è¿½å 1295 # 内部アロケータを @alloc_list に追加 1375 1296 if @celltype.instance_of? CompositeCelltype then 1376 1297 @celltype.get_internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent| 1377 1298 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 不要 1379 1300 1380 1301 @alloc_list << [:NORMAL_ALLOC,port_name,nil,fd_name,par_name,rhs] … … 1384 1305 end 1385 1306 1386 #=== Cell# cell ã®å®ç¾©1387 # æ¬ä½(join)ã®å®ç¾©ã®ç´åã«å¼ã³åºããã1307 #=== Cell# cell の定義 1308 # 本体(join)の定義の直前に呼び出される 1388 1309 def self.new_def 1389 1310 @@current_object.new_def 1390 1311 end 1391 1312 1392 #=== Cell# cell ã®å®ç¾©1393 # æ¬ä½(join)ã®å®ç¾©ã®ç´åã«å¼ã³åºããã1394 # ãã®ã¡ã½ãã㯠cell tCelltype Cell { }; '{', '}' ã®é¨åãããå ´åã«å¼åºããã1313 #=== Cell# cell の定義 1314 # 本体(join)の定義の直前に呼び出される 1315 # このメソッドは cell tCelltype Cell { }; '{', '}' の部分がある場合に呼出される 1395 1316 def new_def 1396 1317 set_specifier_list( Generator.get_statement_specifier ) 1397 1318 1398 # prototype æå®åãªãã1319 # prototype 指定子ないか 1399 1320 if ! @b_prototype then 1400 # äºéå®ç¾©ã®ãã§ãã¯1321 # 二重定義のチェック 1401 1322 if @b_defined == true then 1402 1323 cdl_error( "S1032 $1: duplicate cell" , @name ) 1403 1324 dbgPrint "previous: #{@prev_locale[0]}: line #{@prev_locale[1]} '#{@name}' defined here\n" 1404 1325 1405 # ã»ã«ã®éè¤å®ç¾©ã¨ã©ã¼ã®å¦ç½®1406 # åã®å®ç¾©ã¯æ¨ã¦ã1326 # セルの重複定義エラーの処置 1327 # 前の定義は捨てる 1407 1328 @join_list = NamedList.new( nil, "in cell '#{@name}'" ) 1408 1329 end … … 1417 1338 end 1418 1339 1419 #=== Cell# æ°ããçµåããã§ãã¯1340 #=== Cell# 新しい結合をチェック 1420 1341 # STAGE: P 1421 1342 # 1422 #join:: Join : æ°ããçµå1423 #b_regular:: bool : é常ã®å ´æ (bnf.y.rb)ãããªãã° true, ãã以å¤(allocator, require) ã§ã¯false1343 #join:: Join : 新しい結合 1344 #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false 1424 1345 def new_join( join, b_regular = false ) 1425 1346 join.set_owner self 1426 1347 1427 # composite ã®æ°ææ³å¯¾å¿ï¼ 1428 # composite ã®ä¸ã®ã»ã«ã§ãattribute ã®å®ç¾©ã§ããå ´å 1429 # cell å 1430 ã® attr_ext = composite.attr; æ§æãå¦ç 1348 # composite の新文法対応. 1349 # composite の中のセルで、attribute の定義である場合 1350 # cell 内の attr_ext = composite.attr; 構文を処理 1431 1351 if @in_composite then 1432 1352 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 で指定されていたものがエラーにならないかも 1434 1354 rhs = join.get_rhs 1435 1355 if rhs.instance_of? Expression then 1436 1356 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. 1441 1360 else 1442 # å³è¾ºã¯ attribute ã«ãªãã®ã§ããã°ãå®æ°ã®ã¯ã1443 # å®æ°ã¯ä¸ã¸æ¸¡ã (cell ã® join ã«ãã)1361 # 右辺は attribute にないのであれば、定数のはず 1362 # 定数は下へ渡す (cell の join にする) 1444 1363 ident = nil 1445 1364 end 1446 1365 else 1447 if join.get_rhs.eval_const2(nil) == nil then # å®æ°å¼ã§ã¯ãªããï¼1448 # å³è¾ºããåä¸ã®ã·ã³ãã«ã§ãªãå ´åãç¾ç¶ã¯æ±ããªã1366 if join.get_rhs.eval_const2(nil) == nil then # 定数式ではないか? 1367 # 右辺が、単一のシンボルでない場合、現状は扱えない 1449 1368 cdl_error( "S1033 rhs expression is not supported. Only attribute is permitted on current version." ) 1450 1369 return 1451 1370 else 1452 # å®æ°ã¯ä¸ã¸æ¸¡ã (cell ã® join ã«ãã)1371 # 定数は下へ渡す (cell の join にする) 1453 1372 ident = nil 1454 1373 end … … 1456 1375 1457 1376 if ident then 1458 # attr = attr; ã®ãããªåç 1459 §ã¯ã¨ã©ã¼ (a = composite.a ã¨ããå¿ 1460 è¦ããã) 1377 # attr = attr; のような参照はエラー (a = composite.a とする必要がある) 1461 1378 if @celltype.find( ident ) then 1462 1379 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 ) … … 1464 1381 end 1465 1382 elsif rhs.instance_of? Array then 1466 if rhs[0] == :COMPOSITE then # å³è¾ºã¯ composite.attr ã®å½¢å¼1383 if rhs[0] == :COMPOSITE then # 右辺は composite.attr の形式 1467 1384 ident = rhs[1].to_sym 1468 1385 else 1469 ident = nil # å³è¾ºã¯ { 10, -10 } ã®å½¢å¼1386 ident = nil # 右辺は { 10, -10 } の形式 1470 1387 end 1471 1388 else 1472 ident = nil # å³è¾ºã¯ C_EXP ã®å½¢å¼1389 ident = nil # 右辺は C_EXP の形式 1473 1390 end 1474 1391 1475 # ident ãè¦ã¤ãã£ãï¼å³è¾ºã¯åä¸ã® identï¼1392 # ident が見つかった(右辺は単一の ident) 1476 1393 if ident then 1477 # composite ã®æ§ææ³ã®æ§æå¦çã¸æ¸¡ãï¼ã»ã«å¤ã® attr_ext = Cell.attr; æ§æã®å¦çã«æ¸¡ã1394 # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す 1478 1395 # 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 がエラーにならないかも 1480 1397 if ! decl.instance_of? Decl then 1481 1398 return … … 1485 1402 return 1486 1403 end 1487 # 以ä¸ã®æ§ææ³å®è£ 1488 ã«æ¸¡ãï¼ 1489 # æ§ææ³ã§ã¯ cell ã«åæå¤ãä¸ãããã¨ã§ãcomposite ã§å±æ§ã®åæå¤ãæå®ãããã¨ãã§ãã 1490 # attribute ã§æå®ãããåæå¤ã cell ã®å±æ§ã¨ãã¦å¦çããã 1404 # 以下の旧文法実装に渡す. 1405 # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた 1406 # attribute で指定された初期値を cell の属性として処理させる 1491 1407 join.change_rhs( ini ) 1492 1408 else 1493 # ident ããªãï¼å®æ°å¼1409 # ident がない.定数式 1494 1410 end 1495 1411 else 1496 # celltype ã®å±æ§ã¨ãã¦ããã® join ã®ååããªã1497 # 以ä¸ã® join.set_definition ã®ä¸ã§ã¨ã©ã¼ã¨ãªã1412 # celltype の属性として、この join の名前がない 1413 # 以下の join.set_definition の中でエラーとなる 1498 1414 end 1499 1415 else 1500 return # celltype ããªãï¼ãã§ã«ã¨ã©ã¼1416 return # celltype がない.すでにエラー 1501 1417 end 1502 1418 elsif join.get_rhs.instance_of? Array then 1503 1419 rhs = join.get_rhs 1504 1420 if rhs[0] == :COMPOSITE then 1505 # composite ã®ä¸ã§ãªãã®ã« attr = composite.attr ã使ããã1421 # composite の中でないのに attr = composite.attr が使われた 1506 1422 cdl_error( "S1035 composite : cannot specify out of composite celltype definition" ) 1507 1423 return … … 1509 1425 end 1510 1426 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 以外は、ないはず 1516 1432 1517 1433 # debug 1518 1434 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 # 呼び口配列(であると仮定して)要素を追加 1521 1436 j.add_array_member join 1522 1437 … … 1526 1441 end 1527 1442 1528 # if get_owner then # error S1030 çºçæ get_owner ãè¦ã¤ãããªãã¦ä¾å¤ã«ãªã1443 # if get_owner then # error S1030 発生時 get_owner が見つからなくて例外になる 1529 1444 # dbgPrint "Cell#new_join: #{get_owner.get_name}.#{@name}\n" 1530 1445 # else … … 1540 1455 end 1541 1456 1542 #=== Cell. æ°ããéçµå1457 #=== Cell.新しい逆結合 1543 1458 def self.new_reverse_join( reverse_join ) 1544 1459 @@current_object.new_reverse_join( reverse_join ) 1545 1460 end 1546 1461 1547 #=== Cell# æ°ããéçµå1462 #=== Cell#新しい逆結合 1548 1463 def new_reverse_join( reverse_join ) 1549 1464 dbgPrint( "new_reverse_join name=#{reverse_join.get_name}\n") … … 1570 1485 end 1571 1486 1572 #=== Cell# éçµåããçµåãçæ1487 #=== Cell#逆結合から結合を生成 1573 1488 # STAGE: S 1574 1489 def create_reverse_join … … 1580 1495 # @reverse_join_list.get_items.each{ |rj| 1581 1496 @reverse_join_list.each{ |rj| 1582 # éçµåã®æ 1583 å ±ãå¾ã 1497 # 逆結合の情報を得る 1584 1498 ep_name = rj.get_name 1585 1499 ep_subscript, cp_cell_nsp, cp_name, cp_subscript = rj.get_rhs_cell_and_port 1586 1500 1587 # å¼ã³å£å´ã®ã»ã«ã¨ããã®ã»ã«ã¿ã¤ã1501 # 呼び口側のセルと、そのセルタイプ 1588 1502 cell = Namespace.find cp_cell_nsp 1589 1503 if ! cell.instance_of? Cell then … … 1616 1530 end 1617 1531 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 でしか呼ばれない. 1625 1537 def external_join( internal_cell_elem_name, export_name, b_composite ) 1626 1538 1627 # cCall => composite.cCall; ã§ã¯ãªããï¼1539 # cCall => composite.cCall; ではないか? 1628 1540 if( b_composite == false )then 1629 # cCall => cCall; ã®ãããªå ´å1541 # cCall => cCall; のような場合 1630 1542 if @celltype.find( export_name ) then 1631 1543 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 ) 1632 1544 end 1633 1545 end 1634 # composite ã®æ§ææ³ã«ããããcell å¤ã® cCall = Cell.cCall; ã®æ§æå¦çã«æ¸¡ã1546 # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す 1635 1547 CompositeCelltype.new_join( export_name, @name, internal_cell_elem_name, :CALL ) 1636 1548 end … … 1644 1556 1645 1557 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 # プロトタイプ宣言とする 1648 1560 @b_prototype = false 1649 1561 end 1650 1562 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 で、呼出される 1653 1565 set_specifier_list( Generator.get_statement_specifier ) 1654 1566 end … … 1660 1572 end 1661 1573 1662 #=== Cell# ãããã¿ã¤ã宣è¨(false)ãå®ç¾©(true)ããè¨å®1663 # ãã®ã¡ã½ããã¯æ§æ解éã®æå¾ã«å¼åºããã1574 #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定 1575 # このメソッドは構文解釈の最後に呼出される 1664 1576 #f_def:: bool false if prototype, true if definition 1665 1577 def set_f_def f_def … … 1680 1592 @f_ref = true 1681 1593 1682 # composite ã®å 1683 é¨ã»ã«ãåç 1684 §ããããã¨ã«ãã 1685 # ä»ã®ã¨ããåé¡ãªãããæªåç 1686 §ã§ããã¹ããã®ã¾ã§åç 1687 §ããããã¨ã«ãªã 1594 # composite の内部セルを参照されたことにする 1595 # 今のところ問題ないが、未参照であるべきものまで参照されたことになる 1688 1596 if @cell_list then 1689 1597 @cell_list.each{ |cn,cell| … … 1693 1601 end 1694 1602 1695 #=== Cell# cell ã®æå®åãè¨å®1603 #=== Cell# cell の指定子を設定 1696 1604 # STAGE: B 1697 1605 # 1698 # bnf.y.rb ã®statement_specifiler_list1606 # bnf.y.rb の statement_specifiler_list 1699 1607 #spec_list:: [ :ALLOCATOR, [ [ :NORMAL_ALLOC, ep_name, subscript, func_name, param_name, expr ], ... ] ] 1700 1608 # 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 にて生成す 1707 1614 def set_specifier_list( spec_list ) 1708 return if spec_list == nil # 空ãªãã°ä½ãããªã1615 return if spec_list == nil # 空ならば何もしない 1709 1616 1710 1617 dbgPrint( "set_spec_list: #{@name}\n" ) 1711 b_generate = false # generate ãæå®ããã1618 b_generate = false # generate が指定された 1712 1619 1713 1620 spec_list.each{ |s| 1714 1621 case s[0] # statement_specifier 1715 1622 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]}" # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結 1720 1625 # p "#{a[0]} #{a[0+1]} #{a[2+1]} #{a[3+1]} #{cp_name}" 1721 1626 if a[1+1] then … … 1725 1630 subscript = nil 1726 1631 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 不要 1729 1634 dbgPrint( "new allocator join #{cp_name} #{subscript} #{a[4+1]}\n" ) 1730 1635 Cell.new_join( join ) … … 1772 1677 def get_allocator_list 1773 1678 1774 # æå³ãã§ãã¯(set_definition)ããã¦ããªãï¼1775 # relay ã¢ãã±ã¼ã¿ã®å ´åãã»ã«ã®æå³ãã§ãã¯ãè¡ããã¦ããªãã¨ã@alloc_list ãå®æããªã1679 # 意味チェック(set_definition)されていない? 1680 # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない 1776 1681 if @b_checked == false then 1777 1682 set_definition_join … … 1784 1689 end 1785 1690 1786 #=== id æå®åã®å¤ãè¨å®1787 # ãã®ã¡ã½ããã¯ããã©ã°ã¤ã³ã§ cell ã®çæé åºãå¶å¾¡ãããå ´åã®ããã«è¨ãã1788 # é常㮠id æå®åã§ã¯ä½¿ã£ã¦ããªã1691 #=== id 指定子の値を設定 1692 # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた 1693 # 通常の id 指定子では使っていない 1789 1694 def set_specified_id id 1790 1695 if Integer( id ) != id || id <= 0 then … … 1797 1702 end 1798 1703 1799 #=== Cell# ã»ã«ã¿ã¤ããã©ã°ã¤ã³ (generate æå®å)1704 #=== Cell# セルタイププラグイン (generate 指定子) 1800 1705 def cell_plugin 1801 1706 … … 1811 1716 1812 1717 begin 1813 eval( eval_str ) # plugin ãçæ1718 eval( eval_str ) # plugin を生成 1814 1719 plugin_object.set_locale @locale 1815 1720 @generate[ 2 ] = plugin_object … … 1827 1732 end 1828 1733 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 から呼出される 1837 1741 def clone_for_composite( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale ) 1838 1742 … … 1843 1747 @@cloned_cell_list[ self ] = @my_clone 1844 1748 1845 # clone ããã»ã«ã®å 1846 é¨ã«æã¤ååæ 1847 å ±ã調æ´ãã 1749 # clone したセルの内部に持つ名前情報を調整する 1848 1750 1849 1751 @my_clone.set_cloned( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale ) 1850 1752 1851 # @celltype == nil ã¯ä»¥åã«ã»ã«ã¿ã¤ãæªå®ç¾©ã¨ã©ã¼1753 # @celltype == nil は以前にセルタイプ未定義エラー 1852 1754 if @b_defined == true && @celltype != nil then 1853 1755 if @celltype.instance_of?( Celltype ) then 1854 # celltype ã«ç»é²ï¼ã³ã¼ãçæã®å¯¾è±¡ã¨ãªãï¼1756 # celltype に登録(コード生成の対象となる) 1855 1757 @celltype.new_cell( @my_clone ) 1856 1758 end … … 1860 1762 end 1861 1763 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 されたセルを整える 1870 1770 def set_cloned( name, global_name, namespacePath, join_array, parent_ct_name, region, plugin, locale ) 1871 1771 … … 1884 1784 @f_cloned = true 1885 1785 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 を作る 1890 1790 if @celltype then 1891 1791 dbgPrint "set_cloned: #{@celltype.get_name} #{@name} #{region.get_name}\n" … … 1900 1800 @cell_list2 = [] 1901 1801 1902 # ãã®ã»ã«ã®ã°ãã¼ãã«åãä¸ãã1903 # C_EXP ã®$id$ ç½®æã¯ãã®ã»ã«ã®ååã«ãªã1802 # このセルのグローバル名を与える 1803 # C_EXP の$id$ 置換はこのセルの名前になる 1904 1804 join_array.each { |j| 1905 1805 @join_list.change_item j 1906 1806 } 1907 1807 1908 # clone ãããã¨ããã»ã«ã composit ã»ã«ã¿ã¤ãï¼1808 # clone しようとするセルが composit セルタイプ? 1909 1809 if @celltype.instance_of?( CompositeCelltype ) then 1910 # composite cell ãå帰çã«å±é1810 # composite cell を再帰的に展開 1911 1811 @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale ) 1912 1812 end … … 1914 1814 end 1915 1815 1916 #=== Cell# clone ããã cell ã® join_list ã®å³è¾ºã®å¤æ´1917 # å¼ã³å£ã®å³è¾ºã® cell ãä»ã® clone ããã cell ã«ç½®æã1816 #=== Cell# clone された cell の join_list の右辺の変更 1817 # 呼び口の右辺の cell を他の clone された cell に置換え 1918 1818 def change_rhs_port 1919 1819 … … 1927 1827 if @celltype.instance_of?( CompositeCelltype ) then 1928 1828 1929 # å 1930 ¥ãåã®ã»ã«ã«ã¤ãã¦ãå¤æ´ 1829 # 入れ子のセルについても変更 1931 1830 @cell_list.each{ |name,c| 1932 1831 c.change_rhs_port … … 1967 1866 end 1968 1867 1969 #=== Cell# çæãããã»ã«ãï¼1970 # æé©åãã³ã¼ãçæä¸ã«ã対象ã¨ãªã region ã«å±ããå ´å true ãè¿ã1868 #=== Cell# 生成されるセルか? 1869 # 最適化、コード生成中に、対象となる region に属する場合 true を返す 1971 1870 def is_generate? 1972 1871 if $generating_region == nil then 1973 # æ§æ解éãæå³è§£æ段éã§å¼ã°ããã¨ä¾å¤çºç1872 # 構文解釈、意味解析段階で呼ばれると例外発生 1974 1873 raise "is_generate? called before optimizing" 1975 1874 end … … 1983 1882 end 1984 1883 1985 #=== Cell# composite å 1986 é¨ã®è¤è£½ãããã»ã«ãï¼ 1987 # composite å®ç¾©ã®å 1988 é¨ã®ã»ã« (@in_composite = true) ã§ã¯ãªã 1884 #=== Cell# composite 内部の複製されたセルか? 1885 # composite 定義の内部のセル (@in_composite = true) ではない 1989 1886 def is_cloned? 1990 1887 @f_cloned 1991 1888 end 1992 1889 1993 #=== Cell# composite å 1994 é¨ã®ã»ã«ãï¼ 1890 #=== Cell# composite 内部のセルか? 1995 1891 def is_in_composite? 1996 1892 @in_composite 1997 1893 end 1998 1894 1999 # composite cell ã® port ã«å¯¾å¿ããå 2000 é¨ã® cell ã® port ã®ååï¼ãªã³ã¯æã«å¿ 2001 è¦ãªååï¼ 1895 # composite cell の port に対応する内部の cell の port の名前(リンク時に必要な名前) 2002 1896 def get_real_global_name port_name 2003 1897 if @celltype.instance_of?( CompositeCelltype ) then … … 2027 1921 end 2028 1922 2029 #=== Cell# ã»ã«ã®åãå£ port_name ã«å¯¾ããå®éã®ã»ã«åãåãå£åã '_' ã§é£çµ2030 # namespace å + '_' + ã»ã«å + '_' + åãå£å ï¼ãã®ã»ã«ã composite ãªãã°å±éå¾ã®ã»ã«åãåãå£åï¼1923 #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結 1924 # namespace 名 + '_' + セル名 + '_' + 受け口名 (このセルが composite ならば展開後のセル名、受け口名) 2031 1925 def get_real_global_port_name port_name 2032 1926 2033 # composite ãï¼1927 # composite か? 2034 1928 if @celltype.instance_of?( CompositeCelltype ) then 2035 1929 … … 2042 1936 } 2043 1937 2044 # ã»ã«ã¿ã¤ãå 2045 㧠port_name ã® CompositeCelltypeJoin ãæ¢ãï¼ã³ã¼ãçæ段éã§ã¯å¿ 2046 ãè¦ã¤ããï¼ 1938 # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる) 2047 1939 cj = @celltype.find_export( port_name ) 2048 1940 … … 2050 1942 dbgPrint " composite join name: #{cj.get_name} cell: #{cj.get_cell_name} cell elem: #{cj.get_cell_elem_name}\n" 2051 1943 2052 # composite ã®å 2053 é¨ã®ã»ã«ã«å¯¾ãå帰çã« get_real_global_port_name ãé©ç¨ 1944 # composite の内部のセルに対し再帰的に get_real_global_port_name を適用 2054 1945 name = @cell_list[ "#{cj.get_cell_name}" ].get_real_global_port_name( cj.get_cell_elem_name ) 2055 1946 return name … … 2063 1954 end 2064 1955 2065 #=== Cell# PORT (celltype ã®å®ç¾©) ãå¾ã1956 #=== Cell# PORT (celltype の定義) を得る 2066 1957 def get_real_port( port_name ) 2067 1958 2068 # composite ãï¼1959 # composite か? 2069 1960 if @celltype.instance_of?( CompositeCelltype ) then 2070 1961 2071 # ã»ã«ã¿ã¤ãå 2072 㧠port_name ã® CompositeCelltypeJoin ãæ¢ãï¼ã³ã¼ãçæ段éã§ã¯å¿ 2073 ãè¦ã¤ããï¼ 1962 # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる) 2074 1963 cj = @celltype.find_export( port_name ) 2075 1964 2076 # composite ã®å 2077 é¨ã®ã»ã«ã«å¯¾ãå帰çã« get_real_port ãé©ç¨ 1965 # composite の内部のセルに対し再帰的に get_real_port を適用 2078 1966 port = @cell_list[ "#{cj.get_cell_name}" ].get_real_port( cj.get_cell_elem_name ) 2079 1967 return port … … 2084 1972 end 2085 1973 2086 #=== Cell# cell ãå¾ã2087 # composite ã§ãªããã°èªåèªèº«ãè¿ã1974 #=== Cell# cell を得る 1975 # composite でなければ自分自身を返す 2088 1976 def get_real_cell( port_name ) 2089 1977 2090 # composite ãï¼1978 # composite か? 2091 1979 if @celltype.instance_of?( CompositeCelltype ) then 2092 1980 2093 # ã»ã«ã¿ã¤ãå 2094 㧠port_name ã® CompositeCelltypeJoin ãæ¢ãï¼ã³ã¼ãçæ段éã§ã¯å¿ 2095 ãè¦ã¤ããï¼ 1981 # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる) 2096 1982 cj = @celltype.find_export( port_name ) 2097 1983 2098 # composite ã®å 2099 é¨ã®ã»ã«ã«å¯¾ãå帰çã« get_real_port ãé©ç¨ 1984 # composite の内部のセルに対し再帰的に get_real_port を適用 2100 1985 cell = @cell_list[ "#{cj.get_cell_name}" ].get_real_cell( cj.get_cell_elem_name ) 2101 1986 return cell … … 2107 1992 2108 1993 2109 #=== Cell# åãå£ã®port ã®åç 2110 §ã«ã¦ã³ããã¢ãããã 2111 #port_name:: Symbol : ãã¼ãå 1994 #=== Cell# 受け口のport の参照カウントをアップする 1995 #port_name:: Symbol : ポート名 2112 1996 def port_referenced port 2113 1997 if @referenced_port_list[ port ] then … … 2117 2001 end 2118 2002 2119 # composite ãï¼2003 # composite か? 2120 2004 if @celltype.instance_of?( CompositeCelltype ) then 2121 2005 2122 # ã»ã«ã¿ã¤ãå 2123 㧠port_name ã® CompositeCelltypeJoin ãæ¢ãï¼ã³ã¼ãçæ段éã§ã¯å¿ 2124 ãè¦ã¤ããï¼ 2006 # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる) 2125 2007 cj = @celltype.find_export( port.get_name ) 2126 2008 2127 2009 dbgPrint " port_referenced: #{@celltype.get_name} #{@name} cj=#{cj&&(cj.get_name)||"nil"}\n" 2128 2010 2129 if cj then # æ¢ã«ã¨ã©ã¼ 2130 # composite ã®å 2131 é¨ã®ã»ã«ã«å¯¾ãå帰çã« get_real_port ãé©ç¨ 2011 if cj then # 既にエラー 2012 # composite の内部のセルに対し再帰的に get_real_port を適用 2132 2013 cell = @cell_list[ "#{cj.get_cell_name}" ] 2133 2014 if cell && cell.get_celltype then … … 2181 2062 end 2182 2063 2183 #=== Cell# åãå£é 2184 åã®æ·»æ°ã®æ大å¤ãè¨å® 2064 #=== Cell# 受け口配列の添数の最大値を設定 2185 2065 def set_entry_port_max_subscript( port, num ) 2186 2066 dbgPrint( "set_entry_port_max_subscript: #{@name}.#{port.get_name}: #{num}\n" ) … … 2193 2073 end 2194 2074 2195 #=== Cell# composite ã®å 2196 å´ã»ã«ã®åãå£é 2197 åã®æ·»æ°ã®æ大å¤ãè¨å® 2075 #=== Cell# composite の内側セルの受け口配列の添数の最大値を設定 2198 2076 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 の内側のセルに伝播 2206 2082 if @celltype.instance_of? CompositeCelltype then 2207 2083 cj = @celltype.find_export port.get_name … … 2217 2093 end 2218 2094 2219 #=== Cell# åãå£é 2220 åã®æ·»æ°ã®æ大å¤ãè¿ã 2221 # é·ã㯠+1 ãã 2222 # 1ã¤ããªãå ´å㯠-1 ãè¿ã 2095 #=== Cell# 受け口配列の添数の最大値を返す 2096 # 長さは +1 する 2097 # 1つもない場合は -1 を返す 2223 2098 def get_entry_port_max_subscript( port ) 2224 2099 subscript = @entry_array_max_subscript[port] … … 2229 2104 end 2230 2105 2231 #=== Cell# ãªã¬ã¼ã¢ãã±ã¼ã¿ã®çµåãçæ2106 #=== Cell# リレーアロケータの結合を生成 2232 2107 # STAGE: S 2233 # å¼ã³å£å´ã®çµåãå 2234 ã«åãå£å´ã®çµåãçæ 2108 # 呼び口側の結合を元に受け口側の結合を生成 2235 2109 def create_relay_allocator_join 2236 2110 2237 # celltype ããªããã°ãã§ãã¯ããªãï¼æ¢ã«ã¨ã©ã¼ï¼2111 # celltype がなければチェックしない(既にエラー) 2238 2112 return if @celltype == nil 2239 2113 2240 # relay allocator ãçæ2114 # relay allocator を生成 2241 2115 @celltype.get_port_list.each { |p| 2242 2116 ail = p.get_allocator_instance … … 2244 2118 dbgPrint "create_relay_allocator_join: #{@name}, #{p.get_name}\n" 2245 2119 if p.get_array_size then 2246 # mikan relay allocator ã array ã«å¯¾å¿ã§ãã¦ãããã®ã§ã¯ï¼2120 # mikan relay allocator が array に対応できてもよいのでは? 2247 2121 cdl_error( "S1040 array not supported for relay allocator" ) 2248 2122 next … … 2252 2126 if ai2[0] == :RELAY_ALLOC then 2253 2127 dbgPrint "create_relay_allocator_join: #{@name}, #{name}\n" 2254 # å¼ã³å£å´ã®çµåãåãåºã2128 # 呼び口側の結合を取り出す 2255 2129 ja = @join_list.get_item( :"#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" ) 2256 2130 if ja == nil then 2257 # è¦ã¤ãããªãå ´å2131 # 見つからない場合 2258 2132 found = false 2259 2133 2260 # composite å 2261 ã§å¤é¨ã«çµåããã¦ããã 2134 # composite 内で外部に結合されているか 2262 2135 if @in_composite then 2263 2136 @compositecelltypejoin_list.get_items.each { |cj| … … 2276 2149 cdl_error( "S1041 \'$1_$2_$3\': not joined. cannot create internal join for relay allocator" , ai2[3], ai2[4], ai2[5] ) 2277 2150 print( " In cell #{get_name}\n" ) 2278 # join ãæªçµåã§ãããã¨ã®ã¨ã©ã¼ã¯äºåº¦ã§ã(S1043)2151 # join が未結合であることのエラーは二度でる (S1043) 2279 2152 end 2280 next # æã¡åã2153 next # 打ち切る 2281 2154 end 2282 2155 2283 2156 b_export = false 2284 # composite å 2285 ã®ã»ã«ã§ã¨ã¯ã¹ãã¼ãããã¦ããããã§ã㯠2286 # mikan ã¨ã¯ã¹ãã¼ãå´ã¨ããã¡ãå´ã§ããªã¬ã¼å 2287 ãä¸è´ããããã§ãã¯ãå¿ 2288 è¦ 2157 # composite 内のセルでエクスポートされているかチェック 2158 # mikan エクスポート側と、こちら側で、リレー先が一致するかチェックが必要 2289 2159 if @compositecelltypejoin_list then 2290 # export ããã¦ããã調ã¹ã2160 # export されているか調べる 2291 2161 @compositecelltypejoin_list.get_items.each{ |cj| 2292 # å±æ§å㨠composite ã® export ããååã¯ä¸è´ããã2162 # 属性名と composite の export する名前は一致するか 2293 2163 if p.get_name == cj.get_cell_elem_name then 2294 2164 print "export : #{p.get_name}\n" 2295 b_export = true # å±æ§ã¯ export ããã¦ããã®ã§ãã¨ããããæªåæåã¨ã¯ããªã2165 b_export = true # 属性は export されているので、とりあえず未初期化とはしない 2296 2166 break 2297 2167 end … … 2300 2170 end 2301 2171 2302 # mikan é 2303 å 2172 # mikan 配列 2304 2173 am = nil 2305 2174 if am then … … 2308 2177 subscript = ja2.get_subscript 2309 2178 if b_export == false then 2310 # CompositeCelltype ã®å ´åãå 2311 å´ã®ã»ã«ã§çæããã 2179 # CompositeCelltype の場合、内側のセルで生成させる 2312 2180 join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs, @loacle ) 2313 2181 # p ( "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs ) 2314 2182 new_join( join ) 2315 2183 join.set_definition( @celltype.find(join.get_name) ) 2316 # mikan relay mismatch ãã§ãã¯ãã§ãã¦ããªãï¼ä¸æ¹ãåç 2317 §ï¼ 2184 # mikan relay mismatch チェックができていない(下方を参照) 2318 2185 end 2319 2186 @alloc_list << [ :NORMAL_ALLOC, p.get_name, subscript, ai2[1], ai2[2], rhs ] … … 2321 2188 else 2322 2189 if b_export == false then 2323 # CompositeCelltype ã®å ´åãå 2324 å´ã®ã»ã«ã§çæããã 2190 # CompositeCelltype の場合、内側のセルで生成させる 2325 2191 join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", nil, ja.get_rhs, @locale ) 2326 2192 new_join( join ) … … 2332 2198 "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", 2333 2199 "#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" ) 2334 # æ¬å½ã¯ composite ã®å¼ã³å£ã¨åãå£ã®éã§è¡ãã¹ãã ããå 2335 é¨ã§å¤æ®µæ¥ç¶ããã¦ããå ´å 2200 # 本当は composite の呼び口と受け口の間で行うべきだが、内部で多段接続されている場合 2336 2201 else 2337 2202 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" … … 2348 2213 end 2349 2214 2350 #=== Cell# @@cell_list2 ãä½ã 2351 # @@cell_list2 ã¯ãåºç¾é ã« composite å 2352 ãå«ãã»ã«ã®ãªã¹ã 2215 #=== Cell# @@cell_list2 を作る 2216 # @@cell_list2 は、出現順に composite 内を含むセルのリスト 2353 2217 def self.make_cell_list2 2354 2218 @@cell_list.each{ |c| … … 2358 2222 end 2359 2223 2360 #=== Cell# @@cell_list2 ãå¾ã 2361 # composite å 2362 ãå«ã (compositeãå«ã) 2363 # æå³è§£æå¾ã«ä½æããã 2224 #=== Cell# @@cell_list2 を得る 2225 # composite 内を含む (compositeも含む) 2226 # 意味解析後に作成される 2364 2227 def self.get_cell_list2 2365 2228 @@cell_list2 2366 2229 end 2367 2230 2368 #=== Cell# @@cell_list ãå¾ã2369 #composite ã®ä¸ãå«ã¾ãªã2231 #=== Cell# @@cell_list を得る 2232 #composite の中を含まない 2370 2233 def self.get_cell_list 2371 2234 @@cell_list 2372 2235 end 2373 2236 2374 #=== Cell# reverse_join ãçæãã2237 #=== Cell# reverse_join を生成する 2375 2238 def self.create_reverse_join 2376 2239 @@cell_list.each{ |c| … … 2384 2247 end 2385 2248 2386 #=== Cell# reverse_require_join ãçæãã2249 #=== Cell# reverse_require_join を生成する 2387 2250 def self.create_reverse_require_join 2388 2251 @@cell_list2.each{ |c| … … 2390 2253 # if c.is_generate? then 2391 2254 if ct then 2392 # self ã¸ã®å¼ã³å£å´ã®çµåãçæ2255 # self への呼び口側の結合を生成 2393 2256 ct.create_reverse_require_join c 2394 2257 end … … 2397 2260 end 2398 2261 2399 #=== Cell# åãå£ã®port ã®åç 2400 §ã«ã¦ã³ããè¨å®ãã 2401 # self ã¯å¼ã³å 2402 ã®ã»ã« 2403 # å¼ã³å 2404 ã»ã«ã®åãå£ã®åç 2405 §ã«ã¦ã³ããã¢ãããã 2262 #=== Cell# 受け口のport の参照カウントを設定する 2263 # self は呼び元のセル 2264 # 呼び先セルの受け口の参照カウントをアップする 2406 2265 def set_port_reference_count 2407 2266 @join_list.get_items.each { |j| 2408 2267 if j.get_definition.instance_of? Port then 2409 2268 am = j.get_array_member2 2410 if am then # å¼ã³å£é 2411 å 2269 if am then # 呼び口配列 2412 2270 am.each { |j2| 2413 next if j2 == nil # optional ã§ä¸é¨ãæ¬ è½ãã¦ããã±ã¼ã¹2271 next if j2 == nil # optional で一部が欠落しているケース 2414 2272 cell = j2.get_rhs_cell2 2415 next if cell == nil # å³è¾ºãè¦ã¤ãããªãã£ãï¼æ¢ã«ã¨ã©ã¼2273 next if cell == nil # 右辺が見つからなかった.既にエラー 2416 2274 port = cell.get_celltype.find( j2.get_rhs_port2 ) 2417 2275 dbgPrint( "set_port_reference_count: #{@name}.#{j2.get_name} => #{cell.get_name}.#{port.get_name}\n") … … 2420 2278 else 2421 2279 cell = j.get_rhs_cell2 2422 next if cell == nil # å³è¾ºãè¦ã¤ãããªãã£ãï¼æ¢ã«ã¨ã©ã¼2280 next if cell == nil # 右辺が見つからなかった.既にエラー 2423 2281 port = cell.get_celltype.find( j.get_rhs_port2 ) 2424 2282 dbgPrint( "set_port_reference_count: #{@name}.#{j.get_name} => #{cell.get_name}.#{port.get_name}\n") … … 2429 2287 end 2430 2288 2431 #=== Cell# çµå(Join)ã®ãã§ãã¯2432 # Join ã¯å¼ã³å£ã®çµåã¾ã㯠attribute ã®åæå2289 #=== Cell# 結合(Join)のチェック 2290 # Join は呼び口の結合または attribute の初期化 2433 2291 # 2434 # mikan ãã®ã¡ã½ããã¯ã以ä¸ã®ï¼ã¤ã®ãã§ãã¯ãããªãããåå²ããã»ããããé©åãªé·ãã®ã¡ã½ããã«ãªã 2435 # ã»ãªã¬ã¼ã¢ãã±ã¼ã¿ã®çæ => create_relay_allocator_join 2436 # ã»æªçµåã®å¼ã³å£ã®ãã§ã㯠2437 # ã»ãã¤ã³ã¿åãé 2438 åã§åæåãããå ´åã®ãã§ã㯠2439 # ã»æªåæåã®å±æ§ã®ãã§ã㯠2292 # mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる 2293 # ・リレーアロケータの生成 => create_relay_allocator_join 2294 # ・未結合の呼び口のチェック 2295 # ・ポインタ型が配列で初期化される場合のチェック 2296 # ・未初期化の属性のチェック 2440 2297 def check_join 2441 2298 2442 # celltype ããªããã°ãã§ãã¯ããªãï¼æ¢ã«ã¨ã©ã¼ï¼2299 # celltype がなければチェックしない(既にエラー) 2443 2300 return if @celltype == nil 2444 2301 return if @b_defined == false 2445 return if @f_cloned == true # å 2446 é¨ã»ã«ã«ã¤ãã¦ã¯ãcomposite ã®å®ç¾©æã«ãã§ãã¯ããã¦ãã 2302 return if @f_cloned == true # 内部セルについては、composite の定義時にチェックされている 2447 2303 2448 2304 # debug … … 2452 2308 # end 2453 2309 2454 # æªçµåã®å¼ã³å£ã®ãã§ãã¯2310 # 未結合の呼び口のチェック 2455 2311 @celltype.get_port_list.each { |p| 2456 2312 2457 # å¼ã³å£ã§ãªããã°ããã§ãã¯ããªã2313 # 呼び口でなければ、チェックしない 2458 2314 next if p.get_port_type != :CALL 2459 2315 … … 2461 2317 dbgPrint "check_join: #{@name} #{get_celltype.get_name} #{p.get_name}\n" 2462 2318 2463 # çµåãªã¹ãã®ä¸ããå¼ã³å£åã«ä¸è´ãããã®ãåãã ã2319 # 結合リストの中から呼び口名に一致するものを取りだす 2464 2320 j = @join_list.get_item( p.get_name ) 2465 2321 2466 2322 if j == nil then 2467 # æªçµåã®å¼ã³å£ 2468 2469 # composite celltype ã®å 2470 é¨ã®å ´åãcomposite celltype ã export ããå¼ã³å£ã«çµåããã¦ãããæ¢ã 2323 # 未結合の呼び口 2324 2325 # composite celltype の内部の場合、composite celltype が export する呼び口に結合されているか探す 2471 2326 found = false 2472 2327 if @in_composite then 2473 # composite celltype ã® export ãããã®ãã¹ã¦ããæ¢ã2474 # ï¼export ãããã®ã®å³è¾ºå¤ããæ¢ãããã« get_item ã§ã¯ãã¡ï¼2328 # composite celltype の export するものすべてから探す 2329 # (export するものの右辺値から探すために get_item ではダメ) 2475 2330 @compositecelltypejoin_list.get_items.each{ |cj| 2476 # å¼ã³å£å㨠composite ã® export ããååã¯ä¸è´ããã2331 # 呼び口名と composite の export する名前は一致するか 2477 2332 if p.get_name == cj.get_cell_elem_name then 2478 2333 found = true … … 2481 2336 end 2482 2337 2483 # å¼ã³å£é 2484 åã®å ´å optional ã§å 2485 ¨ã¦ã®è¦ç´ ãåæåãããªãå ´åã«ãããã¸æ¥ã 2338 # 呼び口配列の場合 optional で全ての要素が初期化されない場合に、ここへ来る 2486 2339 if ! found && ! p.is_require? && ! p.is_optional? then 2487 2340 if ! p.is_allocator_port? then … … 2492 2345 end 2493 2346 elsif p.get_array_size.kind_of? Integer then 2494 # æ·»æ°ããå¼ã³å£é 2495 åã®å ´åããã¹ã¦ã®æ·»æ°è¦ç´ ãåæåããã¦ããããã§ãã¯ãã 2347 # 添数あり呼び口配列の場合、すべての添数要素が初期化されているかチェックする 2496 2348 2497 2349 am = j.get_array_member2 2498 2350 if( am )then 2499 # join ã¯é 2500 å 2501 2502 # å¼ã³å£é 2503 åå®ç¾©ã§ã®é 2504 åã®å¤§ãã 2351 # join は配列 2352 2353 # 呼び口配列定義での配列の大きさ 2505 2354 length = p.get_array_size 2506 2355 2507 # é 2508 åã®å¤§ãããå¼ã³å£é 2509 åå®ç¾©ã¨çµåå®ç¾©ã§ä¸è´ãããï¼ 2356 # 配列の大きさが呼び口配列定義と結合定義で一致するか? 2510 2357 if am.length != length then 2511 2358 if ! p.is_optional? || am.length >= length then 2512 # optional ã®å ´åãè¦ç´ æ°ãå°ãªãããã®ã¯OK2359 # optional の場合、要素数が少なすぎるのは OK 2513 2360 cdl_error( "S1044 $1: array initializer too many or few, $2 for $3" , p.get_name, am.length, length ) 2514 2361 end 2515 2362 2516 # am ã®è¦ç´ ã« nil ã追å ãã¦ãã (#_CPA_# ã®ã³ã¼ãçææããã®é 2517 åè¦ç´ æ°åçæ) 2363 # am の要素に nil を追加しておく (#_CPA_# のコード生成時、この配列要素数分生成) 2518 2364 i = am.length 2519 2365 while i < length … … 2523 2369 end 2524 2370 2525 # # é 2526 åè¦ç´ ã®æãããªãããã§ã㯠2527 # if am.length < length then # æºããªãå ´åæ¢ã«ã¨ã©ã¼ã ãè¦ç´ ã®ããç¯å²ã§ãã§ã㯠2371 # # 配列要素の抜けがないかチェック 2372 # if am.length < length then # 満たない場合既にエラーだが要素のある範囲でチェック 2528 2373 # length = am.length 2529 2374 # end … … 2535 2380 end 2536 2381 else 2537 # çæãããªããªã¼ã¸ã§ã³ã¸ã®çµåããã§ãã¯2382 # 生成されないリージョンへの結合かチェック 2538 2383 if ! @in_composite then 2539 2384 am[i].check_region2 … … 2544 2389 2545 2390 # else 2546 # join ãéé 2547 åã§ããã°ãæ¢ã«ã¨ã©ã¼ 2391 # join が非配列であれば、既にエラー 2548 2392 end 2549 2393 elsif j.get_array_member then 2550 # æ·»æ°ãªãå¼ã³å£é 2551 åã®å ´å 2394 # 添数なし呼び口配列の場合 2552 2395 am = j.get_array_member2 2553 2396 length = am.length … … 2562 2405 end 2563 2406 2564 # çæãããªããªã¼ã¸ã§ã³ã¸ã®çµåããã§ãã¯2407 # 生成されないリージョンへの結合かチェック 2565 2408 if ! @in_composite then 2566 2409 am.each { |join| … … 2571 2414 end 2572 2415 else 2573 # å¼ã³å£ï¼»é 2574 åãã§ãªãå ´å 2575 2576 # çæãããªããªã¼ã¸ã§ã³ã¸ã®çµåããã§ã㯠2416 # 呼び口[配列」でない場合 2417 2418 # 生成されないリージョンへの結合かチェック 2577 2419 if ! @in_composite then 2578 2420 j.check_region2 … … 2582 2424 } 2583 2425 2584 # ãã¤ã³ã¿åãé 2585 åã§åæåãããå ´åã®ãã§ã㯠2426 # ポインタ型が配列で初期化される場合のチェック 2586 2427 (@celltype.get_attribute_list+@celltype.get_var_list).each { |a| 2587 2428 if a.get_size_is then 2588 2429 2589 2430 if a.instance_of? CompositeCelltypeJoin then 2590 # æ¢ã«ã¨ã©ã¼ã«ãªã£ã¦ãã2431 # 既にエラーになっている 2591 2432 # cdl_error( "S1047 size_is pointer cannot be exposed for composite attribute" ) 2592 2433 next … … 2598 2439 size = a.get_size_is.eval_const( @join_list, @celltype.get_name_list ) 2599 2440 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 の中で変数が存在しない、型が不適切などのエラーになるはず 2602 2443 cdl_error( "S1049 $1: size_is arg not constant" , a.get_name ) 2603 2444 else … … 2615 2456 end 2616 2457 else 2617 # size_is å¼æ°ãã»ã«ã§æå®ããã¦ãã¦ãåæååãã»ã«ã¿ã¤ãã§æå®ããã¦ããã±ã¼ã¹ã®ãã§ãã¯2458 # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック 2618 2459 ini = a.get_initializer 2619 2460 if ini.instance_of? Expression … … 2630 2471 else 2631 2472 if ! a.instance_of? CompositeCelltypeJoin then 2632 # composite 㯠size_is æå®ã§ããªã2473 # composite は size_is 指定できない 2633 2474 if a.get_type.kind_of?( PtrType ) then 2634 2475 j = @join_list.get_item( a.get_identifier ) 2635 2476 if j && j.get_rhs.instance_of?( Array ) then 2636 ## size_is æå®ããã¦ããªããã¤ã³ã¿ã Array ã§åæåããã¦ããããã¨ã©ã¼ã¨ãã2477 ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする 2637 2478 cdl_error( "S1169 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier ) 2638 2479 end … … 2642 2483 } 2643 2484 2644 # æªåæåã®å±æ§ããã§ãã¯2485 # 未初期化の属性をチェック 2645 2486 @celltype.get_attribute_list.each { |a| 2646 2487 b_init = false 2647 2488 # self.show_tree 1 2648 if a.get_initializer then # ã»ã«ã¿ã¤ãã§åæåããã¦ãã2489 if a.get_initializer then # セルタイプで初期化されている 2649 2490 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 # セルで初期化されている 2653 2494 b_init = true 2654 2495 elsif @in_composite && @compositecelltypejoin_list then 2655 # å±æ§ã export ããã¦ããã調ã¹ããexport ããã¦ããã°æªåæåã¨ã¯ããªã2656 # mikan ãªãã¢ãµã¼ã2496 # 属性が export されているか調べる。export されていれば未初期化とはしない 2497 # mikan リニアサーチ 2657 2498 @compositecelltypejoin_list.get_items.each{ |cj| 2658 # å±æ§å㨠composite ã® export ããååã¯ä¸è´ããã2499 # 属性名と composite の export する名前は一致するか 2659 2500 if a.get_name.to_sym == cj.get_cell_elem_name.to_sym then 2660 b_init = true # å±æ§ã¯ export ããã¦ããã®ã§ãã¨ããããæªåæåã¨ã¯ããªã2501 b_init = true # 属性は export されているので、とりあえず未初期化とはしない 2661 2502 end 2662 2503 } 2663 2504 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 の名前を変換した上でチェックする 2670 2508 if a.get_size_is then 2671 2509 ### p "attr: get_size_is" … … 2673 2511 if cj.get_port_decl.instance_of? Decl then 2674 2512 ### p "attr: get_size_is 2" 2675 # cj_size_is ã¯ãå¤é¨å 2676 ¬éããã attr ã® size_is 2513 # cj_size_is は、外部公開される attr の size_is 2677 2514 cj_size_is = cj.get_port_decl.get_size_is 2678 2515 if cj_size_is == nil then … … 2683 2520 remain = exprs 2684 2521 inner_to_export = {} 2685 ### exprs ã«å«ã¾ããèå¥åãæãåºãã対å¿ãã export ãããååãæ¢ã2522 ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す 2686 2523 while remain != "" && remain != nil 2687 2524 ### p "remain ", remain 2688 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/ # å¤æ°åæååãåãåºã2525 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/ # 変数名文字列を取り出す 2689 2526 if $2 == nil then 2690 2527 break … … 2693 2530 remain = $' 2694 2531 ### p exprs, $1, $2, $' 2695 # size_is ã«å«ã¾ããå¤æ°ã¯ãcomposite 㧠export ããã¦ããã2532 # size_is に含まれる変数は、composite で export されているか 2696 2533 cj2 = nil 2697 2534 @compositecelltypejoin_list.get_items.each{ |cj2t| … … 2706 2543 if cj2.get_port_decl.instance_of? Decl then 2707 2544 decl2 = cj2.get_port_decl 2708 # å 2709 é¨ã®ååã¨å¤é¨ã®ååã®å¯¾å¿é¢ä¿ãè¨æ¶ 2545 # 内部の名前と外部の名前の対応関係を記憶 2710 2546 inner_to_export[arg_name] = decl2.get_name 2711 # else cj2 㯠Port (æ¢ã«ã¨ã©ã¼)2547 # else cj2 は Port (既にエラー) 2712 2548 end 2713 2549 end 2714 # å 2715 é¨ã®ååãå¤é¨ã®ååã§ç½®æ 2550 # 内部の名前を外部の名前で置換 2716 2551 inner_to_export.each{ |arg_name, exp_name| 2717 2552 ### p "changing #{arg_name}=>#{exp_name}" 2718 2553 # 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 ) # 文字列末尾にあるケース 2721 2556 } 2722 2557 ### p "changed: #{exprs} #{cj_size_is.to_s}" … … 2724 2559 cdl_error( "S1172 \'$1\' size_is argument mismatch with exporting one \'$2\'", a.get_name, cj.get_name ) 2725 2560 end 2726 # else cj 㯠Port (æ¢ã«ã¨ã©ã¼)2561 # else cj は Port (既にエラー) 2727 2562 end 2728 2563 end … … 2737 2572 end 2738 2573 2739 #=== Cell# é require ããã§ãã¯ãã 2740 # é require æå®ãããåãå£ã«è¤æ°ã®çµåããªãããã§ãã¯ãã 2741 # composite ã®å 2742 é¨ã»ã« (f_cloned=true) ããã§ãã¯ãã 2574 #=== Cell# 逆 require をチェックする 2575 # 逆 require 指定された受け口に複数の結合がないかチェックする 2576 # composite の内部セル (f_cloned=true) もチェックする 2743 2577 def check_reverse_require 2744 # celltype ããªããã°ãã§ãã¯ããªãï¼æ¢ã«ã¨ã©ã¼ï¼2578 # celltype がなければチェックしない(既にエラー) 2745 2579 return if @celltype == nil 2746 2580 return if @b_defined == false 2747 2581 2748 2582 # p "check reverse require #{@name}" 2749 # érequire æå®ãããåãå£ã«è¤æ°ã®çµåããªãããã§ãã¯2583 # 逆require 指定された受け口に複数の結合がないかチェック 2750 2584 @referenced_port_list.each{ |port,count| 2751 2585 # p port.class, count … … 2757 2591 end 2758 2592 2759 #=== Cell# require å¼ã³å£ã®çµåãè¡ã2593 #=== Cell# require 呼び口の結合を行う 2760 2594 # 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 オブジェクト 2764 2598 def set_require_join( cp_name, cell_or_ct, port ) 2765 2599 2766 # set_require_join ã¯2度å¼ã³åºããã2767 # 2 度ç®ã¯ post ã³ã¼ããçæããå¾ ##### ãã£ããè¦åããï¼éè¤ã¨ã©ã¼ãè¦éãï¼2600 # set_require_join は2度呼び出される 2601 # 2度目は post コードを生成した後 ##### いったん見合わせ(重複エラーを見逃す) 2768 2602 # if @require_joined_list[ cp_name ] then 2769 2603 # return … … 2782 2616 end 2783 2617 else 2784 # require: cell ã§æå®2618 # require: cell で指定 2785 2619 cell = cell_or_ct 2786 2620 if @region.distance( cell.get_region ) == nil then … … 2792 2626 cdl_warning( "W1003 $1 : require call port overridden in $2" , cp_name, @name ) 2793 2627 else 2794 # require ã® join ãçæ(å¼ã³å£ã®çµå)2628 # require の join を生成(呼び口の結合) 2795 2629 # rhs = Expression.new( [ :OP_DOT, [ :IDENTIFIER, Token.new( cell.get_name, nil, nil, nil ) ], 2796 2630 nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace ) … … 2805 2639 end 2806 2640 2807 #=== Cell# Join ã® definition ã®è¨å®ã¨ãã§ãã¯2641 #=== Cell# Join の definition の設定とチェック 2808 2642 # STAGE: S 2809 2643 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 # 既に設定(チェック)済み 2813 2647 2814 2648 dbgPrint "set_definition_join in #{@name}\n" 2815 2649 2816 # relay allocator ããã©ã£ã¦åå 2817 ¥ããªããããå 2818 é 㧠@b_checked ã true ã«ãã 2650 # relay allocator をたどって再入しないよう、先頭で @b_checked を true にする 2819 2651 @b_checked = true 2820 2652 … … 2822 2654 check_restrict_list 2823 2655 2824 # compoiste ã»ã«ã®ã¯ãã¼ã³ããããã®ã¯ãset_definition ä¸è¦ 2825 # å 2826 ã® join ã¯æ¢ã« definition ããã¦ãã 2827 # å 2828 ã®ã»ã«ã«ããã¦ã代å 2829 ¥ãã§ãã¯ããã¦ããã®ã§ãäºéã«ãã§ãã¯(throughé©ç¨)ããã¦ãã¾ã 2656 # compoiste セルのクローンされたものは、set_definition 不要 2657 # 元の join は既に definition されている 2658 # 元のセルにおいて、代入チェックされているので、二重にチェック(through適用)されてしまう 2830 2659 @join_list.get_items.each{ |join| 2831 2660 dbgPrint " set_definition_join: checking #{@name}.#{join.get_name}\n" … … 2833 2662 port = @celltype.find(join.get_name) 2834 2663 join.get_array_member2.each { |am| 2835 if am == nil then # æªçµåã®å ´åãã¨ã©ã¼ãã§ãã¯ã¯check_join2664 if am == nil then # 未結合の場合、エラーチェックは check_join 2836 2665 if port && ! port.is_optional? then 2837 # ãã¹ãç¨ã«ã¨ã©ã¼ã¡ãã»ã¼ã¸åºå2666 # テスト用にエラーメッセージ出力 2838 2667 # cdl_error( "TEMPORAL set_definition_join: uninitialized array member" ) 2839 2668 end … … 2848 2677 end 2849 2678 2850 # ãªã¬ã¼ join 㯠through ãã©ã°ã¤ã³çæå¾ã«ããã§ããªã 2851 # through å¾ã«çµåå 2852 ãå 2853 ¥ãæ¿ãããã 2679 # リレー join は through プラグイン生成後にしかできない 2680 # through 後に結合先が入れ替えられる 2854 2681 create_relay_allocator_join 2855 2682 2856 # composite ã»ã«ã®å±é2683 # composite セルの展開 2857 2684 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) 2862 2687 expand 2863 2688 end 2864 2689 2865 # celltype ã« generate ãæå®ããããã¦ããã2690 # celltype に generate が指定されされているか 2866 2691 celltype_plugin = @celltype.get_celltype_plugin 2867 2692 if celltype_plugin then … … 2875 2700 end 2876 2701 2877 #=== Cell# composite ã»ã«ã®å±é2878 # ãã®ã»ã«ã composite ã»ã«ã¿ã¤ã2702 #=== Cell# composite セルの展開 2703 # このセルが composite セルタイプ 2879 2704 def expand 2880 2705 … … 2882 2707 dbgPrint "expanding #{@name} #{@celltype.get_name}\n" 2883 2708 2884 # å±éãããã»ã«ã®ãªã¹ã2709 # 展開されたセルのリスト 2885 2710 @@cloned_cell_list = {} 2886 2711 2887 # composite celltype ã® cell ãå±é2712 # composite celltype の cell を展開 2888 2713 @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale ) 2889 2714 2890 # ãããã¿ã¤ããåç 2891 §ããã¦ããå ´åãåãåç 2892 §ããã¦ãããã¨ã«ãã 2715 # プロトタイプが参照されている場合、子も参照されていることにする 2893 2716 if @f_ref then 2894 2717 dbgPrint "expand: set_f_ref\n" … … 2896 2719 end 2897 2720 2898 # å¼ã³å£ã®å³è¾ºã®ã»ã«ã clone ãããã®ã«å¤æ´2721 # 呼び口の右辺のセルを clone したものに変更 2899 2722 self.change_rhs_port 2900 2723 2901 # ãããã¿ã¤ã宣è¨ã§è¨å®ããã¦ãããã®ãåæ ãã2724 # プロトタイプ宣言で設定されていたものを反映する 2902 2725 @entry_array_max_subscript.each{ |port,name| 2903 2726 set_entry_inner_port_max_subscript( port, name ) … … 2905 2728 end 2906 2729 2907 #=== Cell#restrict ã追å2730 #=== Cell#restrict を追加 2908 2731 def add_restrict( entry_name, func_name, region_name_list ) 2909 2732 if @restrict_list[ entry_name ] then … … 2994 2817 puts "entry array #{port.get_name}: max subscript=#{num}" 2995 2818 } 2996 if @cell_list then # ãã㧠@cell_list ã nil ãªã®ã¯Bug2819 if @cell_list then # ここで @cell_list が nil なのは Bug 2997 2820 (indent+1).times { print " " } 2998 2821 puts "cloned cell list:" … … 3018 2841 subscript = "" 3019 2842 end 3020 # ã¢ãã±ã¼ã¿å¼ã³å£ã®çµåãçæ2843 # アロケータ呼び口の結合を生成 3021 2844 (indent+2).times { print " " } 3022 2845 puts "#{cp_name}#{subscript} = #{a[4+1]}" … … 3042 2865 # @real_singleton:: bool : has singleton cell in this composite celltype 3043 2866 # @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 エクスポート定義 3045 2868 # @internal_allocator_list:: [ [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], ... ] 3046 2869 … … 3082 2905 3083 2906 Namespace.new_compositecelltype( self ) 3084 set_namespace_path # @NamespacePath ã®è¨å®2907 set_namespace_path # @NamespacePath の設定 3085 2908 3086 2909 @port_list = [] … … 3098 2921 def end_of_parse 3099 2922 3100 # singleton ã«é¢ãããã§ãã¯2923 # singleton に関するチェック 3101 2924 if @b_singleton && @real_singleton == nil then 3102 2925 cdl_warning( "W1004 $1 : specified singleton but has no singleton in this celltype" , @name ) … … 3107 2930 end 3108 2931 3109 # active ã«é¢ãããã§ãã¯2932 # active に関するチェック 3110 2933 if @b_active && @real_active == nil then 3111 2934 cdl_error( "S1054 $1 : specified active but has no active in this celltype" , @name ) … … 3114 2937 end 3115 2938 3116 # @allocator_instance ãè¨å®ãã2939 # @allocator_instance を設定する 3117 2940 @name_list.get_items.each{ |n| 3118 2941 if n.instance_of? Port then … … 3121 2944 } 3122 2945 3123 # ãªã¬ã¼ã¢ãã±ã¼ã¿ã® entry å´2946 # リレーアロケータの entry 側 3124 2947 @port_list.each{ |p| 3125 2948 if p.get_port_type == :ENTRY then … … 3135 2958 end 3136 2959 } 3137 # mikan relay ãæ£ããæãã¦ããããã§ãã¯ããã¦ããªã3138 3139 # æå³è§£æ2960 # mikan relay が正しく抜けているかチェックされていない 2961 2962 # 意味解析 3140 2963 @cell_list.get_items.each{ |c| 3141 2964 c.set_definition_join 3142 2965 } 3143 2966 3144 # cell ã®æªçµåã®å¼ã³å£ããªãããã§ãã¯2967 # cell の未結合の呼び口がないかチェック 3145 2968 @cell_list.get_items.each{ |c| 3146 2969 c.check_join … … 3148 2971 } 3149 2972 3150 # å¼ã³å£ã®çµåã«ã¤ãã¦ãexport ã¨å 3151 é¨çµåã®ä¸¡æ¹ããªãããã§ã㯠3152 # ãªã¬ã¼ã¢ãã±ã¼ã¿ãå 3153 é¨ã¢ãã±ã¼ã¿ã®è¨å® 2973 # 呼び口の結合について、export と内部結合の両方がないかチェック 2974 # リレーアロケータ、内部アロケータの設定 3154 2975 @port_list.each{ |p| 3155 2976 p.check_dup_init 3156 2977 } 3157 2978 3158 # ãã¹ã¦ã®ã¨ã¯ã¹ãã¼ãå®ç¾©ã«å¯¾å¿ããå¼ã³å£ãåãå£ãå±æ§ãåå¨ããããã§ãã¯2979 # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック 3159 2980 @name_list.get_items.each{ |n| 3160 2981 if( @export_name_list.get_item( n.get_name ) == nil )then … … 3163 2984 } 3164 2985 3165 # å 3166 é¨ã¢ãã±ã¼ã¿ãè¨å®ãã 2986 # 内部アロケータを設定する 3167 2987 @internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent| 3168 2988 res = ext_alloc_ent.get_allocator_rhs_elements( :INTERNAL_ALLOC ) … … 3195 3015 cell.set_owner self # Cell (in_omposite) 3196 3016 @cell_list.add_item( cell ) 3197 if cell.get_celltype then # nil ãªãã°ããã§ã«ã»ã«ã¿ã¤ããªãã¨ã©ã¼3017 if cell.get_celltype then # nil ならば、すでにセルタイプなしエラー 3198 3018 if cell.get_celltype.is_singleton? then 3199 3019 @real_singleton = cell … … 3213 3033 end 3214 3034 3215 #=== CompositeCelltype# CompositeCelltypeJoin ãä½æ3035 #=== CompositeCelltype# CompositeCelltypeJoin を作成 3216 3036 # 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 # の構文要素の出現に対して呼び出される 3232 3047 def new_join( export_name, internal_cell_name, 3233 3048 internal_cell_elem_name, type ) … … 3242 3057 3243 3058 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 # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック 3250 3064 obj = celltype.find( internal_cell_elem_name ) 3251 3065 if obj.instance_of?( Decl ) then … … 3255 3069 elsif type != :ATTRIBUTE then 3256 3070 cdl_error( "S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute" , export_name ) 3257 # return 次ã®ã¨ã©ã¼ãé¿ããããã«å¦çç¶è¡ããä»ãå ãã¦ã¿ã3071 # return 次のエラーを避けるために処理続行し、付け加えてみる 3258 3072 end 3259 3073 elsif obj.instance_of?( Port ) then 3260 3074 if obj.get_port_type != type then 3261 3075 cdl_error( "S1060 \'$1\' : port type mismatch. $2 type is allowed here." , export_name, type ) 3262 # return 次ã®ã¨ã©ã¼ãé¿ããããã«å¦çç¶è¡ããä»ãå ãã¦ã¿ã3076 # return 次のエラーを避けるために処理続行し、付け加えてみる 3263 3077 end 3264 3078 else … … 3268 3082 end 3269 3083 3270 # ã¨ã¯ã¹ãã¼ãå®ç¾©ã¨ä¸è´ãããã©ãããã§ãã¯3084 # エクスポート定義と一致するかどうかチェック 3271 3085 obj2 = @name_list.get_item( export_name ) 3272 3086 if( obj2 == nil )then … … 3284 3098 elsif obj.get_signature != obj2.get_signature then 3285 3099 if obj.get_signature != nil && obj2.get_signature != nil then 3286 # nil ãªãã°æ¢ã«ã¨ã©ã¼ãªã®ã§å ±åããªã3100 # nil ならば既にエラーなので報告しない 3287 3101 cdl_error( "S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'" , export_name, obj.get_signature.get_name, obj2.get_signature.get_name ) 3288 3102 end … … 3309 3123 if obj.instance_of?( Decl ) then 3310 3124 # attribute 3311 # # å 3312 é¨ããå¤é¨ã¸è¤æ°ã®çµåããªãããã§ã㯠3125 # # 内部から外部へ複数の結合がないかチェック 3313 3126 # found = false 3314 3127 # @attr_list.each{ |a| … … 3323 3136 else 3324 3137 # call/entry port 3325 # # å 3326 é¨ããå¤é¨ã¸è¤æ°ã®çµåããªãããã§ã㯠3138 # # 内部から外部へ複数の結合がないかチェック 3327 3139 # found = false 3328 3140 # @port_list.each{ |port| … … 3337 3149 end 3338 3150 3339 # join ã @export_name_list ã«ç»é²ï¼éè¤ãã§ãã¯ã¨ã¨ãã«ï¼å¾ã§è¡ããã CompositeCelltypeJoin ã® clone ã«åããï¼3151 # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える) 3340 3152 if obj.instance_of?( Decl ) && @export_name_list.get_item( export_name ) then 3341 # æ¢ã«åå¨ããã追å ããªããæ°ä»æ§ã§ã¯ã@export_name_list ã«åãååãå«ã¾ãããã¨ãããã3153 # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。 3342 3154 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 に同じ名前が含まれることがある。 3344 3156 else 3345 3157 @export_name_list.add_item( join ) 3346 3158 end 3347 3159 3348 # export ãããã¼ãã«å«ã¾ãã send/receive ãã©ã¡ã¼ã¿ã®ã¢ãã±ã¼ã¿(allocator)å¼ã³å£ãã»ã«ã¨çµå3160 # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合 3349 3161 if obj2.instance_of? Port then 3350 3162 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 ) 3352 3164 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 # ポート名 関数名 パラメータ名 3355 3167 cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}" 3356 3168 3357 # ãªã¬ã¼ã¢ãã±ã¼ã¿ or å 3358 é¨ã¢ãã±ã¼ã¿æå®ããªããã¦ããå ´åãã¢ãã±ã¼ã¿å¼ã³å£ã追å ããªã 3359 # ãã®æç¹ã§ã¯ get_allocator_instance ã§ã¯å¾ãããªããã tmp ãå¾ã 3169 # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない 3170 # この時点では get_allocator_instance では得られないため tmp を得る 3360 3171 if port.get_allocator_instance_tmp then 3361 3172 found = false … … 3365 3176 3366 3177 if s[0] == :INTERNAL_ALLOC then 3367 # å 3368 é¨ã¢ãã±ã¼ã¿ã®å ´å # mikan ããã¯å 3369 é¨ã®ã»ã«ã«ç´çµãããå¤é¨ã®ãã¼ãã«æ¹ããã¹ã 3178 # 内部アロケータの場合 # mikan これは内部のセルに直結する。外部のポートに改めるべき 3370 3179 @internal_allocator_list << [ cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3] ] 3371 3180 end … … 3377 3186 end 3378 3187 3379 # å¤é¨ã¢ãã±ã¼ã¿ã®å ´å3188 # 外部アロケータの場合 3380 3189 new_join( cp_name, internal_cell_name, cp_internal_name, :CALL ) 3381 3190 end … … 3383 3192 end 3384 3193 3385 # ã¨ã¯ã¹ãã¼ãå®ç¾©ãè¿ã3194 # エクスポート定義を返す 3386 3195 return obj2 3387 3196 end … … 3405 3214 @name_list.add_item port 3406 3215 3407 # export ãããã¼ãã«å«ã¾ãã send/receive ãã©ã¡ã¼ã¿ã®ã¢ãã±ã¼ã¿å¼ã³å£ã® export ãçæãã¦ãã¼ãã«è¿½å 3408 # ãã®æç¹ã§ã¯å 3409 é¨ã¢ãã±ã¼ã¿ãã©ããå¤æã§ããªãã®ã§ãã¨ããããçæãã¦ãã 3216 # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加 3217 # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく 3410 3218 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 ) 3412 3220 when :SEND, :RECEIVE 3413 #### ãªã¬ã¼ã¢ãã±ã¼ã¿ or å 3414 é¨ã¢ãã±ã¼ã¿æå®ããªããã¦ããå ´åãã¢ãã±ã¼ã¿å¼ã³å£ã追å ããªã 3415 # å 3416 é¨ã¢ãã±ã¼ã¿æå®ããªããã¦ããå ´åãã¢ãã±ã¼ã¿å¼ã³å£ã追å ããªã 3417 # ãã®æç¹ã§ã¯ get_allocator_instance ã§ã¯å¾ãããªããã tmp ãå¾ã 3221 #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない 3222 # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない 3223 # この時点では get_allocator_instance では得られないため tmp を得る 3418 3224 if port.get_allocator_instance_tmp then 3419 3225 found = false … … 3430 3236 3431 3237 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 ) # 呼び口を生成 3438 3243 created_port.set_allocator_port( port, fd, par ) 3439 3244 if port.is_omit? then 3440 3245 created_port.set_omit 3441 3246 end 3442 new_port( created_port ) # ã»ã«ã¿ã¤ãã«æ°ããå¼ã³å£ã追å3247 new_port( created_port ) # セルタイプに新しい呼び口を追加 3443 3248 # else 3444 3249 # already error … … 3457 3262 attribute.each { |a| 3458 3263 a.set_owner self # Decl (CompositeCelltype) 3459 # V1.1.0.10 composite ã® attr ã® size_is ã¯å¯ã¨ãªã£ã3264 # V1.1.0.10 composite の attr の size_is は可となった 3460 3265 # if a.get_size_is then 3461 3266 # cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name ) … … 3468 3273 end 3469 3274 3470 #=== CompositeCelltype# érequire ã®çµåãçæãã3275 #=== CompositeCelltype# 逆require の結合を生成する 3471 3276 def create_reverse_require_join cell 3472 3277 @name_list.get_items.each{ |n| … … 3493 3298 return @name_list.get_item( name ) 3494 3299 3495 # å¾æ¥ä»æ§3300 # 従来仕様 3496 3301 # cj = @export_name_list.get_item( name ) 3497 3302 #p "#{name}, #{cj.get_port_decl}" … … 3503 3308 end 3504 3309 3505 #=== CompositeCelltype# export ãã CompositeCelltypeJoin ãå¾ã3310 #=== CompositeCelltype# export する CompositeCelltypeJoin を得る 3506 3311 #name:: string: 3507 # attribute ã®å ´åãåãååã«å¯¾ãè¤æ°åå¨ããå¯è½æ§ãããããæåã®ãã®ããè¿ããªã3312 # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない 3508 3313 def find_export name 3509 3314 return @export_name_list.get_item( name ) 3510 3315 end 3511 3316 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 ã®NamedList3317 #=== 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 3516 3321 #RETURN: 3517 3322 # [ { name => cell }, [ cell, ... ] ] 3518 # æ»ãå¤ å㯠ååâcloneãããå 3519 é¨ã»ã«ãå¾ã㯠composite ã®åºç¾é ã®ãªã¹ã 3323 # 戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト 3520 3324 def expand( name, global_name, namespacePath, join_list, region, plugin, locale ) 3521 3325 … … 3526 3330 } 3527 3331 3528 # å±é㧠clone ãããã»ã«ã®ãªã¹ããå³è¾ºã¯ Cell (composite ã®å ´å composite 㪠cell ã®clone)3332 # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone) 3529 3333 clone_cell_list = {} 3530 3334 clone_cell_list2 = [] 3531 3335 3532 # composite å 3533 é¨ã®ãã¹ã¦ã® cell ã«ã¤ã㦠3336 # composite 内部のすべての cell について 3534 3337 @cell_list.get_items.each { |c| 3535 3338 … … 3537 3340 dbgPrint "expand : cell #{c.get_name}\n" 3538 3341 3539 # Join ã®é 3540 å 3342 # Join の配列 3541 3343 ja = [] 3542 3344 3543 # CompositeCelltype ã export ããå¼ã³å£ãåãå£ãå±æ§ã®ãªã¹ãã«ã¤ãã¦3345 # CompositeCelltype が export する呼び口、受け口、属性のリストについて 3544 3346 # @export_name_list.get_items.each{ |cj| # cj: CompositeCelltypeJoin 3545 # æ°ä»æ§ã§ã¯ã@export_name_list ã«å 3546 ¥ã£ã¦ããªã attr ããããã 3347 # 新仕様では、@export_name_list に入っていない attr がありうる 3547 3348 (@port_list+@attr_list).each{ |cj| # cj: CompositeCelltypeJoin 3548 3349 … … 3550 3351 dbgPrint " cj : #{cj.get_name}\n" 3551 3352 3552 # CompositeCelltypeJoin (export) ã®å¯¾è±¡ã»ã«ãï¼3353 # CompositeCelltypeJoin (export) の対象セルか? 3553 3354 if cj.match?( c ) then 3554 3355 3555 # 対象ã»ã«å 3556 ã® CompositeCelltype ã® export ãã Join (attribute ã¾ã㯠call port) 3356 # 対象セル内の CompositeCelltype の export する Join (attribute または call port) 3557 3357 j = join_list.get_item( cj.get_name ) 3558 3358 … … 3565 3365 3566 3366 if j then 3567 # å¼ã³å£ãå±æ§ã®å ´å3568 # ComositeCell ç¨ã®ãã®(j) ã対象ã»ã«ç¨ã« clone (@through_list ãã³ãã¼ããã)3367 # 呼び口、属性の場合 3368 # ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる) 3569 3369 # p "expand: cloning Join #{j.get_name} #{@name} #{name}" 3570 3370 jc = j.clone_for_composite( @name, name, locale ) … … 3574 3374 # p "cn #{jc.get_name} #{cj.get_cell_elem_name}" 3575 3375 3576 # 対象ã»ã«ã®å¼ã³å£ã¾ãã¯å±æ§ã®ååã«å¤æ´3376 # 対象セルの呼び口または属性の名前に変更 3577 3377 jc.change_name( cj.get_cell_elem_name ) 3578 3378 3579 # 対象ã»ã«ã«å¯¾ãã Join ã®é 3580 å 3379 # 対象セルに対する Join の配列 3581 3380 ja << jc 3582 3381 end … … 3590 3389 dbgPrint "expand : clone #{name}_#{c.get_name}\n" 3591 3390 3592 # ã»ã«ã® clone ãçæ3391 # セルの clone を生成 3593 3392 # clone_cell_list[ "#{name}_#{c.get_name}" ] = c.clone_for_composite( name, global_name, ja ) 3594 3393 c2 = c.clone_for_composite( name, global_name, namespacePath, ja, @name, region, plugin, locale ) … … 3600 3399 clone_cell_list.each { |nm,c| 3601 3400 dbgPrint " cloned: #{nm} = #{c.get_global_name}\n" 3602 # join ã® owner ã clone ãããã»ã«ã«å¤æ´ããV1.1.0.253401 # join の owner を clone されたセルに変更する V1.1.0.25 3603 3402 c.get_join_list.get_items.each{ |j| 3604 3403 j.set_cloned( clone_cell_list[ "#{c.get_local_name}" ] ) … … 3608 3407 end 3609 3408 3610 #=== CompositeCelltype æå®åãªã¹ãã®è¨å®3409 #=== CompositeCelltype 指定子リストの設定 3611 3410 def set_specifier_list( spec_list ) 3612 3411 return if spec_list == nil … … 3639 3438 3640 3439 def get_var_list 3641 [] # 空ã®é 3642 åãè¿ã 3440 [] # 空の配列を返す 3643 3441 end 3644 3442 … … 3647 3445 end 3648 3446 3649 #== CompositeCelltype# generate æå®åã®æ 3650 å ± 3651 # CompositeCelltype ã«ã¯ generate ãæå®ã§ããªãã®ã§ nil ãè¿ã 3652 # Celltype::@generate ãåç 3653 §ã®ã㨠3447 #== CompositeCelltype# generate 指定子の情報 3448 # CompositeCelltype には generate が指定できないので nil を返す 3449 # Celltype::@generate を参照のこと 3654 3450 def get_celltype_plugin 3655 3451 nil … … 3664 3460 end 3665 3461 3666 #=== CompositeCelltype# ã¢ã¯ãã£ãã§ã¯ãªã 3667 # active ã§ã¯ãªãã«å ããå 3668 ¨ã¦ã®å 3669 é¨ã»ã«ã®ã»ã«ã¿ã¤ãã inactive ã®å ´åã« inactive 3670 # ï¼å 3671 é¨ã®ã»ã«ã active ã¾ã㯠factory ãæã£ã¦ããï¼ 3462 #=== CompositeCelltype# アクティブではない 3463 # active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive 3464 # (内部のセルが active または factory を持っている) 3672 3465 def is_inactive? 3673 3466 if @b_active == false then 3674 3467 @cell_list.get_items.each{ |c| 3675 3468 if c.get_celltype && c.get_celltype.is_inactive? == false then 3676 # c.get_celltype == nil ã®å ´åã¯ã»ã«ã¿ã¤ãæªå®ç¾©ã§ãã§ã«ã¨ã©ã¼3469 # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー 3677 3470 return false 3678 3471 end … … 3714 3507 3715 3508 3716 #== æ§æè¦ç´ ï¼å£ã表ãã¯ã©ã¹ï¼ã»ã«ã¿ã¤ãã®å¼ã³å£ãåãå£ï¼3509 #== 構文要素:口を表すクラス(セルタイプの呼び口、受け口) 3717 3510 class Port < BDNode 3718 3511 # @name:: str … … 3720 3513 # @port_type:: :CALL, :ENTRY 3721 3514 # @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呼び元セルの呼び口名 3726 3517 # 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 : この呼び口ができる元となった呼び口または受け口のパラメータ 3734 3522 # 3735 # set_specifier ã«ãã£ã¦è¨å®ããã(3523 # set_specifier によって設定される( 3736 3524 # @allocator_instance:: Hash : {"func_param" => [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]} 3737 3525 # [:INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ] … … 3739 3527 # function parameter rhs 3740 3528 # 3741 # @b_require:: bool : require ã«ããçæããã call port ã®å ´åtrue3742 # @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 キーワードが指定された (呼び口のみ) 3748 3536 # 3749 3537 # optimize:: 3750 # @celltype:: å±ããã»ã«ã¿ã¤ã3538 # @celltype:: 属するセルタイプ 3751 3539 # 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 の時有効) 3761 3546 # 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 # スケルトン関数不要 3765 3550 3766 3551 def initialize( name, sig_path, port_type, array_size = nil, reverse_require_cell_path = nil, reverse_require_entry_port_name = nil ) … … 3778 3563 @array_size = array_size.eval_const(nil) 3779 3564 else 3780 @array_size = array_size # ããã¯ã¢ãã±ã¼ã¿å¼ã³å£ã®å ´åï¼å 3781 ã®å¼ã³å£ã§æ¢ã«è©ä¾¡æ¸ã¿ï¼ 3565 @array_size = array_size # これはアロケータ呼び口の場合(元の呼び口で既に評価済み) 3782 3566 end 3783 3567 if @array_size == nil then … … 3794 3578 object = Namespace.find( sig_path ) #1 3795 3579 if object == nil then 3796 # mikan signature ã®ååãä¸å®å 3797 ¨ 3580 # mikan signature の名前が不完全 3798 3581 cdl_error( "S1075 \'$1\' signature not found" , sig_path ) 3799 3582 elsif ! object.instance_of?( Signature ) then 3800 # mikan signature ã®ååãä¸å®å 3801 ¨ 3583 # mikan signature の名前が不完全 3802 3584 cdl_error( "S1076 \'$1\' not signature" , sig_path ) 3803 3585 else … … 3806 3588 end 3807 3589 3808 # érequire3590 # 逆require 3809 3591 @reverse_require_cell_path = nil 3810 3592 @reverse_require_entry_port_name = nil … … 3816 3598 @reverse_require_entry_port_name = reverse_require_entry_port_name 3817 3599 3818 # åãå£é 3819 åãï¼ 3600 # 受け口配列か? 3820 3601 if array_size then 3821 3602 cdl_error( "S1153 $1: cannot be entry port array for fixed join port", @name ) 3822 3603 end 3823 3604 3824 # å¼ã³å£ã®ã»ã«ã¿ã¤ããæ¢ã3605 # 呼び口のセルタイプを探す 3825 3606 ct_or_cell = Namespace.find( @reverse_require_cell_path ) #1 3826 3607 if ct_or_cell.instance_of? Cell then … … 3837 3618 3838 3619 if ct == nil then 3839 return # æ¢ã«ã¨ã©ã¼ 3840 end 3841 3842 # æ·»ãåãªãã®å¼ã³å£é 3843 åãï¼ 3620 return # 既にエラー 3621 end 3622 3623 # 添え字なしの呼び口配列か? 3844 3624 port = ct.find( @reverse_require_entry_port_name ) 3845 3625 if port == nil || port.get_port_type != :CALL … … 3863 3643 end 3864 3644 3865 #=== Port# æé©åã«é¢ããå¤æ°ããªã»ãããã3866 # Region ãã¨ã«æé©åã®ãããªãããããããããªã»ãããã3645 #=== Port#最適化に関する変数をリセットする 3646 # Region ごとに最適化のやりなおしをするため、リセットする 3867 3647 def reset_optimize 3868 3648 if @port_type == :CALL then 3869 3649 # 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 # 唯一の呼び先セル 3878 3655 else 3879 3656 # entry port optimize 3880 3657 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 の時、受け口関数を呼出す) 3884 3661 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 の時、受け口関数を呼出す) 3888 3665 end 3889 3666 end … … 3914 3691 end 3915 3692 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 # この呼び口が生成されるもとになった呼び口または受け口の情報を設定 3922 3698 def set_allocator_port( port, fd, par ) 3923 3699 @allocator_port = port … … 3951 3727 end 3952 3728 3953 #=== Port# require å¼ã³å£ãååãæã¤ï¼3954 # require éå®3729 #=== Port# require 呼び口が名前を持つ? 3730 # require 限定 3955 3731 def has_name? 3956 3732 @b_has_name … … 3965 3741 end 3966 3742 3967 #=== Port# omit æå®ããã¦ãã?3743 #=== Port# omit 指定されている? 3968 3744 def is_omit? 3969 3745 @b_omit || ( @signature && @signature.is_empty? ) … … 3974 3750 end 3975 3751 3976 def set_VMT_useless # VMT é¢æ°ãã¼ãã«ã使ç¨ããªã3752 def set_VMT_useless # VMT 関数テーブルを使用しない 3977 3753 @b_VMT_useless = true 3978 3754 end 3979 3755 3980 def set_skelton_useless # ã¹ã±ã«ãã³é¢æ°ä¸è¦ (true ã®æãåãå£é¢æ°ãå¼åºã)3756 def set_skelton_useless # スケルトン関数不要 (true の時、受け口関数を呼出す) 3981 3757 @b_skelton_useless = true 3982 3758 end 3983 3759 3984 def set_cell_unique # å¼ã³å 3985 ã»ã«ã¯ä¸ã¤ã ã 3760 def set_cell_unique # 呼び先セルは一つだけ 3986 3761 @b_cell_unique = true 3987 3762 end 3988 3763 3989 #=== Port# å¼ã³å£/åãå£ã®æå®åã®è¨å®3990 # inline, allocator ã®æå®3764 #=== Port# 呼び口/受け口の指定子の設定 3765 # inline, allocator の指定 3991 3766 def set_specifier spec_list 3992 3767 spec_list.each { |s| … … 4033 3808 end 4034 3809 4035 #=== Port# ãªã¬ã¼ã¢ãã±ã¼ã¿ãå 4036 é¨ã¢ãã±ã¼ã¿ã®ã¤ã³ã¹ã¿ã³ã¹ãè¨å® 4037 # å¼ã³å£ã®åæ¹åç 4038 §å¯è½ãªããã«ãã»ã«ã¿ã¤ãã®è§£éã®æå¾ã§è¡ã 3810 #=== Port# リレーアロケータ、内部アロケータのインスタンスを設定 3811 # 呼び口の前方参照可能なように、セルタイプの解釈の最後で行う 4039 3812 def set_allocator_instance 4040 3813 if @allocator_instance_tmp == nil then … … 4049 3822 case alloc_type 4050 3823 when :INTERNAL_ALLOC 4051 if ! @owner.instance_of? CompositeCelltype then # ãã¹ãé²ãããã« composite ã§ãªããã°ã¨ãã4052 cdl_error( "S1081 self allocator not supported yet" ) # mikan ããã¯ãµãã¼ãããã¦ããã¯ããè¦èª¿æ»12/1/153824 if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした 3825 cdl_error( "S1081 self allocator not supported yet" ) # mikan これはサポートされているはず。要調査 12/1/15 4053 3826 next 4054 3827 end … … 4057 3830 # OK 4058 3831 when :NORMAL_ALLOC 4059 # ããã¸æ¥ãã®ã¯ composite ã®åãå£ã§å³è¾ºã "eEnt.func.param" å½¢å¼ã§æå®ããã¦ããå ´å3832 # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合 4060 3833 cdl_error( "S1174 $1 not suitable for lhs, suitable lhs: 'func.param'", "#{ai[1]}.#{ai[3]}.#{ai[4]}" ) 4061 3834 next … … 4064 3837 end 4065 3838 4066 # '=' 左辺(func_name,param_name)ã¯å®å¨ããã?4067 if @signature then # signature = nil ãªãæ¢ã«ã¨ã©ã¼3839 # '=' 左辺(func_name,param_name)は実在するか? 3840 if @signature then # signature = nil なら既にエラー 4068 3841 fh = @signature.get_function_head( ai[1] ) 4069 3842 if fh == nil then … … 4073 3846 decl = fh.get_declarator 4074 3847 if ! decl.is_function? then 4075 next # æ¢ã«ã¨ã©ã¼3848 next # 既にエラー 4076 3849 end 4077 3850 paramdecl = decl.get_type.get_paramlist.find( ai[2] ) … … 4090 3863 end 4091 3864 4092 # éè¤æå®ããªãã?3865 # 重複指定がないか? 4093 3866 if @allocator_instance[ "#{@name}_#{ai[1]}_#{ai[2]}" ] then 4094 3867 cdl_error( "S1085 duplicate allocator specifier for \'$1_$2\'" , ai[1], ai[2] ) 4095 3868 end 4096 3869 4097 # å³è¾ºã®ãã§ãã¯3870 # 右辺のチェック 4098 3871 case alloc_type 4099 3872 when :INTERNAL_ALLOC … … 4105 3878 end 4106 3879 4107 ep_name = ele[1] # ã¢ãã±ã¼ã¿åãå£å3880 ep_name = ele[1] # アロケータ受け口名 4108 3881 ep = @owner.find ep_name.get_path[0] # mikan "a::b" 4109 3882 if ep == nil || ! ep.instance_of?( Port ) || ep.get_port_type != :ENTRY || ! ep.get_signature.is_allocator? then 4110 3883 cdl_error( "S1175 $1 not found or not allocator entry port for $2" , ep_name, ai[1] ) 4111 3884 end 4112 # å³è¾ºãã§ãã¯çµãã3885 # 右辺チェック終わり 4113 3886 # ai2 = [ :INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ] 4114 3887 ai2 = [ ai[0], ai[1], ai[2], ep_name ] … … 4122 3895 # ele[0] ele[1][0] ele[1][1][0] ele[1][1][1] ele[1][2] ele[2] 4123 3896 # 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 の変種を作成して置き換えるべき 4125 3898 4126 3899 cdl_error( "S1176 rhs not in 'call_port.func.param' form for for $1_$2" , ai[1], ai[2] ) # S1086 … … 4128 3901 end 4129 3902 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 # リレーする先の呼び口 4132 3904 if cp then 4133 # mikan cp ãå¼ã³å£ã§ãããã¨ã®ãã§ãã¯ï¼å±æ§ã®å ´åãããï¼ 4134 # mikan åãå£ããåãå£ã¸ã®ãªã¬ã¼ã¸ã®å¯¾å¿ (å¼ã³å£ããå¼ã³å£ã¸ã®ãªã¬ã¼ã¯ããããªã) <=== ææ³ã«ããããäºé 4135 ï¼å¼ã³å£å´ã§ã¢ãã±ã¼ã¿ã決å®ãããï¼ 3905 # mikan cp が呼び口であることのチェック(属性の場合もある) 3906 # mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない) <=== 文法にかかわる事項(呼び口側でアロケータが決定される) 4136 3907 sig = cp.get_signature 4137 3908 if sig && @signature then … … 4143 3914 decl = fh.get_declarator 4144 3915 if ! decl.is_function? then 4145 next # æ¢ã«ã¨ã©ã¼3916 next # 既にエラー 4146 3917 end 4147 3918 paramdecl = decl.get_type.get_paramlist.find( param_name ) … … 4162 3933 4163 3934 # else 4164 # sig == nil ãªãã°æ¢ã«ã¨ã©ã¼3935 # sig == nil ならば既にエラー 4165 3936 end 4166 3937 else … … 4173 3944 next 4174 3945 end 4175 # å³è¾ºãã§ãã¯çµãã3946 # 右辺チェック終わり 4176 3947 # ai2 = [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ] 4177 3948 ai2 = [ ai[0], ai[1], ai[2], cp_name, func_name, param_name ] … … 4186 3957 end 4187 3958 4188 def is_VMT_useless? # VMT é¢æ°ãã¼ãã«ã使ç¨ããªã3959 def is_VMT_useless? # VMT 関数テーブルを使用しない 4189 3960 @b_VMT_useless 4190 3961 end 4191 3962 4192 def is_skelton_useless? # ã¹ã±ã«ãã³é¢æ°ä¸è¦ (true ã®æãåãå£é¢æ°ãå¼åºã)3963 def is_skelton_useless? # スケルトン関数不要 (true の時、受け口関数を呼出す) 4193 3964 @b_skelton_useless 4194 3965 end 4195 3966 4196 def is_cell_unique? # å¼ã³å 4197 ã®ã»ã«ã¯ä¸ã¤ï¼ 3967 def is_cell_unique? # 呼び先のセルは一つ? 4198 3968 @b_cell_unique 4199 3969 end 4200 3970 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 とする 4208 3975 def set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless ) 4209 3976 if ! b_VMT_useless then … … 4215 3982 end 4216 3983 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 となる 4222 3988 def set_only_callee( callee_port, callee_cell ) 4223 3989 @only_callee_port = callee_port … … 4225 3991 end 4226 3992 4227 #=== Port# å¯ä¸ã®çµåå 4228 ãã¼ããè¿ã(compositeã®å ´åå®ã»ã«) 4229 # optional å¼ã³å£ã§æªçµåã®å ´å nil ãè¿ã 3993 #=== Port# 唯一の結合先ポートを返す(compositeの場合実セル) 3994 # optional 呼び口で未結合の場合 nil を返す 4230 3995 def get_real_callee_port 4231 3996 if @only_callee_cell then … … 4234 3999 end 4235 4000 4236 #=== Port# å¯ä¸ã®çµåå 4237 ã»ã«ãè¿ã(compositeã®å ´åå®ã»ã«) 4238 # optional å¼ã³å£ã§æªçµåã®å ´å nil ãè¿ã 4001 #=== Port# 唯一の結合先セルを返す(compositeの場合実セル) 4002 # optional 呼び口で未結合の場合 nil を返す 4239 4003 def get_real_callee_cell 4240 4004 if @only_callee_cell then … … 4251 4015 end 4252 4016 4253 #=== Port# érequire ã®çµåãçæãã4017 #=== Port# 逆require の結合を生成する 4254 4018 # STAGE: S 4255 4019 def create_reverse_require_join cell … … 4258 4022 end 4259 4023 4260 # å¼ã³å 4261 ã»ã«ãæ¢ã 4024 # 呼び元セルを探す 4262 4025 ct_or_cell = Namespace.find( @reverse_require_cell_path ) # mikan namespace #1 4263 4026 if ct_or_cell.instance_of? Cell then … … 4265 4028 ct = cell2.get_celltype 4266 4029 if ct == nil then 4267 return # æ¢ã«ã¨ã©ã¼4030 return # 既にエラー 4268 4031 end 4269 4032 elsif ct_or_cell.instance_of? Celltype then … … 4275 4038 ct = ct_or_cell 4276 4039 else 4277 # æ¢ã«ã¨ã©ã¼ï¼ç¡è¦4040 # 既にエラー:無視 4278 4041 return 4279 4042 end 4280 4043 4281 # çµåãçæãã4044 # 結合を生成する 4282 4045 dbgPrint "create_reverse_require_join #{cell2.get_name}.#{@reverse_require_entry_port_name}[] = #{cell.get_name}.#{@name}" 4283 4046 nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace ) … … 4291 4054 end 4292 4055 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 に代入 4305 4066 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| # すべてのパラメータについて 4311 4071 pr.call( port, fd, par ) 4312 4072 } … … 4315 4075 end 4316 4076 4317 #=== Port# érequireæå®ããã¦ããï¼4077 #=== Port# 逆require指定されている? 4318 4078 def is_reverse_required? 4319 4079 @reverse_require_cell_path != nil … … 4357 4117 #== Namespace 4358 4118 # 4359 # root namespace ã ããRegion ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã¨ãã¦çæããã 4360 # root namespace ã¯ãroot region ãå 4361 ¼ãããã 4119 # root namespace だけ、Region クラスのインスタンスとして生成される 4120 # root namespace は、root region を兼ねるため 4362 4121 # 4363 # @cell_list 㯠Region ã®å ´åã«ã®ã¿æ㤠(mikan @cell_list é¢é£ã¯ Region ã«ç§»ãã¹ã)4122 # @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき) 4364 4123 # 4365 4124 class Namespace < NSBDNode 4366 # @name:: Symbol # root ã®å ´å"::" (String)4125 # @name:: Symbol # root の場合 "::" (String) 4367 4126 # @global_name:: str 4368 4127 # @name_list:: NamedList Signature,Celltype,CompositeCelltype,Cell,Typedef,Namespace 4369 4128 # @struct_tag_list:: NamedList : StructType 4370 # @namespace_list:: Namespace[] : Region 㯠Namespace ã®åã¯ã©ã¹ã§ãããå«ã¾ãã4129 # @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる 4371 4130 # @signature_list:: Sginature[] 4372 4131 # @celltype_list:: Celltype[] … … 4374 4133 # @cell_list:: Cell[] 4375 4134 # @typedef_list:: Typedef[] 4376 # @decl_list:: ( Typedef | StructType | EnumType )[] ä¾åé¢ä¿ãããå ´åã«åãã¦ãé çªã©ããã«é 4377 åã«æ ¼ç´ mikan enum 4135 # @decl_list:: ( Typedef | StructType | EnumType )[] 依存関係がある場合に備えて、順番どおりに配列に格納 mikan enum 4378 4136 # @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, pop4383 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 階層用のスタック 4385 4143 @@namespace_stack = [] # @@namespace_stack[0] = "::" (generator.rb) 4386 4144 @@namespace_sp = -1 4387 4145 4388 # Generator ãã¹ãç¨ã®ã¹ã¿ã㯠(namespace é層ç¨ã®ã¹ã¿ãã¯ã対æ¯ãã)4146 # Generator ネスト用のスタック (namespace 階層用のスタックを対比する) 4389 4147 @@nest_stack_index = -1 4390 4148 @@nest_stack = [] … … 4392 4150 @@root_namespace = nil 4393 4151 4394 # Generator ãã¹ãç¨ã¹ã¿ãã¯ã® push, pop (ã¯ã©ã¹ã¡ã½ãã)4152 # Generator ネスト用スタックの push, pop (クラスメソッド) 4395 4153 def self.push 4396 4154 dbgPrint "push Namespace\n" … … 4412 4170 end 4413 4171 4414 # namespace é層ç¨ã¹ã¿ãã¯ã® push, pop (ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã)4172 # namespace 階層用スタックの push, pop (インスタンスメソッド) 4415 4173 def push ns 4416 4174 @@namespace_sp += 1 … … 4434 4192 if( name == "::" )then 4435 4193 if( @@root_namespace != nil )then 4436 # root ã¯ä¸åã®ã¿çæã§ãã4194 # root は一回のみ生成できる 4437 4195 raise "try to re-create root namespace" 4438 4196 end … … 4443 4201 if ns.kind_of? Namespace then 4444 4202 dbgPrint "namespace: re-appear #{@name}\n" 4445 # ç»é²æ¸ã¿ namespace ã®åç»é²4203 # 登録済み namespace の再登録 4446 4204 ns.push ns 4447 4205 return … … 4454 4212 end 4455 4213 4456 if @@namespace_sp >= 0 then # root ã¯é¤å¤4214 if @@namespace_sp >= 0 then # root は除外 4457 4215 @@namespace_stack[@@namespace_sp].new_namespace( self ) 4458 4216 end 4459 4217 push self 4460 4218 4461 @global_name = Namespace.get_global_name # stack ç»é²å¾åã4219 @global_name = Namespace.get_global_name # stack 登録後取る 4462 4220 @name_list = NamedList.new( nil, "symbol in namespace '#{@name}'" ) 4463 4221 @struct_tag_list = NamedList.new( nil, "struct tag" ) … … 4474 4232 @cache_generating_region = nil 4475 4233 if @NamespacePath == nil then 4476 # root namespace ã®å ´åã¯è¨å®æ¸ (親 namespace ãè¦ã¤ãããä¾å¤ã«ãªã)4477 set_namespace_path # @NamespacePath ã®è¨å®4234 # root namespace の場合は設定済 (親 namespace が見つからず例外になる) 4235 set_namespace_path # @NamespacePath の設定 4478 4236 end 4479 4237 end … … 4487 4245 end 4488 4246 4489 #=== Namespace:: global_name ãå¾ã4490 # parse ä¸ã®ã¿ãã®ã¡ã½ããã¯ä½¿ãã4247 #=== Namespace:: global_name を得る 4248 # parse 中のみこのメソッドは使える 4491 4249 # STAGE: P 4492 def self.get_global_name # parse ä¸æå¹4250 def self.get_global_name # parse 中有効 4493 4251 if @@namespace_sp <= 0 then 4494 4252 return "" … … 4509 4267 end 4510 4268 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 の条件判定は不要となる 4516 4274 def get_n_cells 4517 4275 if @cache_generating_region == $generating_region then 4518 # ãã®ã¡ã½ããã¯ç¹°ãè¿ãå¼ã³åºããããããçµæããã£ãã·ã¥ãã4276 # このメソッドは繰り返し呼び出されるため、結果をキャッシュする 4519 4277 return @cache_n_cells 4520 4278 end … … 4522 4280 count = 0 4523 4281 @cell_list.each{ |c| 4524 # å®ç¾©ããããã¿ã¤ã宣è¨ã ããã¯ãnew_cell ã®æ®µéã§å¤æã§ããªããããã«ã¦ã³ãããªãã4282 # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす 4525 4283 if c.get_f_def == true then 4526 4284 # print "get_n_cells: cell: #{c.get_name}\n" … … 4533 4291 count += ns.get_n_cells 4534 4292 else 4535 # ns 㯠Region ã§ãã4293 # ns は Region である 4536 4294 rt = ns.get_region_type 4537 4295 # print "get_n_cells: region: #{ns.get_name}: #{rt}\n" 4538 4296 if rt == :NODE || rt == :LINKUNIT then 4539 # å¥ã® linkunit ãªã®ã§å ç®ããªã4297 # 別の linkunit なので加算しない 4540 4298 else 4541 4299 count += ns.get_n_cells … … 4549 4307 end 4550 4308 4551 #=== Namespace.find : in_path ã§ç¤ºããããªãã¸ã§ã¯ããæ¢ã4309 #=== Namespace.find : in_path で示されるオブジェクトを探す 4552 4310 #in_path:: NamespacePath 4553 #in_path:: Array : å¤ãå½¢å¼4311 #in_path:: Array : 古い形式 4554 4312 # path [ "::", "ns1", "ns2" ] absolute 4555 4313 # path [ "ns1", "ns2" ] relative … … 4566 4324 if name == "::" then 4567 4325 i = 1 4568 name = path[i] # æ§æçã«å¿ 4569 ãåå¨ 4326 name = path[i] # 構文的に必ず存在 4570 4327 object = @@root_namespace.find( name ) # root 4571 4328 else 4572 # ç¸å¯¾ãã¹4329 # 相対パス 4573 4330 i = 0 4574 4331 object = @@namespace_stack[@@namespace_sp].find_one( name ) # crrent … … 4603 4360 4604 4361 unless object.kind_of?( Namespace ) then 4605 # ã¯ã©ã¹ã¡ã½ããå 4606 㧠cdl_error ãå¼ã³åºããã¨ã¯ã§ããªã 4607 # ã¾ããåæ¹åç 4608 §å¯¾å¿å¾ãæ£ç¢ºãªè¡çªå·ãåºãªãåé¡ãçãã 4362 # クラスメソッド内で cdl_error を呼び出すことはできない 4363 # また、前方参照対応後、正確な行番号が出ない問題も生じる 4609 4364 # cdl_error( "S1092 \'$1\' not namespace" , name ) 4610 # ãã®ã¡ã½ãããã nil ã帰ã£ãå ´å "not found" ãåºãã®ã§ãããã§ã¯åºããªã4365 # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない 4611 4366 return nil 4612 4367 end … … 4624 4379 end 4625 4380 4626 #=== Namespace# namespace ããæ¢ããè¦ã¤ãããªããã°è¦ª namespace ããæ¢ã4381 #=== Namespace# namespace から探す。見つからなければ親 namespace から探す 4627 4382 def self.find_one( name ) 4628 4383 return @@namespace_stack[@@namespace_sp].find_one( name ) … … 4632 4387 4633 4388 object = find( name ) 4634 # ããã¯åºãã4389 # これは出すぎ 4635 4390 # dbgPrint "in '#{@name}' find '#{name}' object #{object ? object.class : "Not found"}\n" 4636 4391 … … 4649 4404 4650 4405 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 から根に向かって探す 4654 4409 i = @@namespace_sp 4655 4410 while i >= 0 … … 4727 4482 end 4728 4483 4729 #=== Namespace# åç 4730 §ããã¦ããããæªå®ç¾©ã®ã»ã«ãæ¢ã 4731 # ãããã¿ã¤ã宣è¨ã ãã§å®ç¾©ããã¦ããªãã±ã¼ã¹ãã¨ã©ã¼ã¨ãã 4732 # ååã®æªçµåã»ã«ã«ã¤ãã¦è¦åãã 4484 #=== Namespace# 参照されているが、未定義のセルを探す 4485 # プロトタイプ宣言だけで定義されていないケースをエラーとする 4486 # 受動の未結合セルについて警告する 4733 4487 def check_ref_but_undef 4734 4488 @cell_list.each { |c| 4735 if ! c.get_f_def then # Namespace ã® @cell_list ã«ã¯ãããã¿ã¤ããå«ã¾ããã±ã¼ã¹ãã4489 if ! c.get_f_def then # Namespace の @cell_list にはプロトタイプが含まれるケースあり 4736 4490 if c.get_f_ref then 4737 4491 cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str ) … … 4753 4507 end 4754 4508 4755 #=== Namespace# ã»ã«ã®åãå£ã®åç 4756 §ã«ã¦ã³ããè¨å®ãã 4509 #=== Namespace# セルの受け口の参照カウントを設定する 4757 4510 def set_port_reference_count 4758 4511 @cell_list.each { |c| … … 4770 4523 4771 4524 def new_structtype( struct ) 4772 # struct.set_owner self # StructType (Namespace) # StructType 㯠BDNode ã§ã¯ãªã4525 # struct.set_owner self # StructType (Namespace) # StructType は BDNode ではない 4773 4526 dup = @struct_tag_list.get_item(struct.get_name) 4774 4527 if dup != nil then 4775 4528 if struct.same? dup then 4776 # åããã®ã typedef ããã4529 # 同じものが typedef された 4777 4530 # p "#{struct.get_name}" 4778 4531 return … … 4798 4551 if typedef_type.get_type_str == dup_type.get_type_str && 4799 4552 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 として扱われる 4803 4556 # typedef long LONG; 4804 4557 # typedef long LONG; 4805 # bnf.y.rb ã§ã¯ declarator ã« TYPE_NAME ã許ããªãã®ã§ãããã¸æ¥ããã¨ã¯ãªã4558 # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない 4806 4559 # p "#{typedef.get_declarator.get_type.get_type_str} #{typedef.get_name} #{typedef.get_declarator.get_type.get_type_str_post}" 4807 4560 return … … 4844 4597 def new_const_decl( decl ) 4845 4598 decl.set_owner self # Decl (Namespace:const) 4846 if ! decl.is_const? then # const 修飾ãã¦ãããã¨4599 if ! decl.is_const? then # const 修飾さていること 4847 4600 if decl.is_type?( PtrType ) then 4848 4601 cdl_error( "S1094 $1: pointer is not constant. check \'const\'" , decl.get_name ) … … 4852 4605 elsif ! decl.is_type?( IntType ) && ! decl.is_type?( FloatType ) && 4853 4606 ! decl.is_type?( BoolType ) && ! decl.is_type?( PtrType ) then 4854 # IntType, FloatType ã§ãããã¨4607 # IntType, FloatType であること 4855 4608 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 # 初期値を持つこと 4857 4610 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 初期値が型に対し適切であること 4860 4613 # cdl_error( "S1098 $1: has unsuitable initializer" , decl.get_name ) 4861 4614 else … … 4879 4632 ### 4880 4633 4881 #=== Namespace# ãã¹ã¦ã®ã»ã«ã® require ãã¼ããè¨å®4634 #=== Namespace# すべてのセルの require ポートを設定 4882 4635 # STAGE: S 4883 4636 def set_require_join … … 4885 4638 ct.set_require_join 4886 4639 } 4887 # ãã¹ã¦ã® namespace ã«ã¤ã㦠require ãã¼ããã»ãã4640 # すべての namespace について require ポートをセット 4888 4641 @namespace_list.each{ |ns| 4889 4642 ns.set_require_join … … 4891 4644 end 4892 4645 4893 #=== Namespace# Join ã¸ã® definition ã®è¨å®ã¨ãã§ãã¯4894 # ã»ã«ã¿ã¤ãã«å±ãããã¹ã¦ã®ã»ã«ã«å¯¾ãã¦å®æ½4646 #=== Namespace# Join への definition の設定とチェック 4647 # セルタイプに属するすべてのセルに対して実施 4895 4648 def set_definition_join 4896 # celltype ã®ã³ã¼ããçæ4649 # celltype のコードを生成 4897 4650 @cell_list.each { |c| 4898 4651 dbgPrint "set_definition_join #{c.get_name}\n" … … 4904 4657 end 4905 4658 4906 #=== Namespace# ã»ã«ã®çµåããã§ãã¯ãã4659 #=== Namespace# セルの結合をチェックする 4907 4660 def check_join 4908 4661 @cell_list.each { |c| … … 4916 4669 end 4917 4670 4918 #== Namespace# ã«ã¼ãã?4919 # ã«ã¼ããã¼ã ã¹ãã¼ã¹ 㨠ã«ã¼ããªã¼ã¸ã§ã³ã¯åã4671 #== Namespace# ルートか? 4672 # ルートネームスペース と ルートリージョンは同じ 4920 4673 def is_root? 4921 4674 @name == "::" 4922 4675 end 4923 4676 4924 #== Namespace# ã«ã¼ããå¾ã4925 # ã«ã¼ããªã¼ã¸ã§ã³ã¨ã«ã¼ããã¼ã ã¹ãã¼ã¹ã¯åããªãã¸ã§ã¯ã4677 #== Namespace# ルートを得る 4678 # ルートリージョンとルートネームスペースは同じオブジェクト 4926 4679 def self.get_root 4927 4680 @@root_namespace … … 4945 4698 # 4946 4699 # 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 : 右辺の受け口 4952 4705 # @array_member:: rhs array : available only for first appear in the same name 4953 4706 # @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: 右辺の添数 4955 4708 # 4956 4709 4957 4710 # @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 4961 4713 # [ [plugin_name, cell_name, plugin_arg], [plugin_name2, cell_name2, plugin_arg], ... ] 4962 # @region_through_list:: region ã«æå®ãããthrough4714 # @region_through_list:: region に指定された through 4963 4715 # [ [plugin_name, cell_name, plugin_arg, region], [plugin_name2, cell_name2, plugin_arg, region2], ... ] 4964 4716 # 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 に対応 4967 4719 # 4968 4720 4969 4721 include PluginModule 4970 4722 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: 右辺の式 4976 4727 def initialize( name, subscript, rhs, locale = nil ) 4977 4728 # dbgPrint "Join#new: #{name}, #{subscript} #{rhs.eval_const(nil)}\n" … … 4985 4736 @name = name 4986 4737 if subscript.instance_of?( Expression ) then 4987 #mikan é 4988 åæ·»æ°ãæ´æ°ã§ãããã¨ãæªãã§ã㯠4738 #mikan 配列添数が整数であることを未チェック 4989 4739 @subscript = subscript.eval_const(nil) 4990 4740 if @subscript == nil then … … 4998 4748 @definition = nil 4999 4749 5000 # é 5001 åè¦ç´ ãè¨å® 5002 # æ¬å½ã¯ãååºã®è¦ç´ ã®ã¿è¨å®ããã®ãé©å½ 5003 # new_join 㧠add_array_member ã®ä¸ã§ååºè¦ç´ ã® array_member ã«å¯¾ãè¨å®ãã 4750 # 配列要素を設定 4751 # 本当は、初出の要素のみ設定するのが適当 4752 # new_join で add_array_member の中で初出要素の array_member に対し設定する 5004 4753 if @subscript == -1 then 5005 4754 @array_member = [self] … … 5019 4768 end 5020 4769 5021 #=== Join# 左辺ã«å¯¾å¿ãã celltype ã®å®ç¾©ãè¨å®ããã¨ã¨ãã«ãã§ãã¯ãã4770 #=== Join# 左辺に対応する celltype の定義を設定するとともにチェックする 5022 4771 # STAGE: S 5023 4772 # 5024 # 代å 5025 ¥å¯è½ããã§ãã¯ãã 5026 #definition:: Decl (attribute,varã®æ) ã¾ã㯠Port (callã®æ) ã¾ã㯠nil (definition ãè¦ã¤ãããªãã£ãæ) 4773 # 代入可能かチェックする 4774 #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時) 5027 4775 5028 4776 def set_definition( definition ) … … 5030 4778 dbgPrint "set_definition: #{@owner.get_name}.#{@name} = #{definition.class}\n" 5031 4779 5032 # äºéãã§ãã¯ã®é²æ¢4780 # 二重チェックの防止 5033 4781 if @definition then 5034 # set_definition ãåå¥ã«è¡ãã±ã¼ã¹ã§ãäºéã«è¡ãããå¯è½æ§ãããï¼ç°å¸¸ã§ã¯ãªãï¼5035 # äºéã« set_definition ãå®è¡ããã㨠through ãäºéã«é©ç¨ããã¦ãã¾ã4782 # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない) 4783 # 二重に set_definition が実行されると through が二重に適用されてしまう 5036 4784 # cdl_warning( "W9999 $1, internal error: set_definition duplicate", @name ) 5037 4785 return … … 5040 4788 @definition = definition 5041 4789 5042 # mikan 左辺å¤ãå³è¾ºå¤ã®åãã§ãã¯ãªã©4790 # mikan 左辺値、右辺値の型チェックなど 5043 4791 if @definition.instance_of?( Decl ) then 5044 4792 check_var_init 5045 4793 elsif @definition.instance_of?( Port ) then 5046 4794 check_call_port_init 5047 if @definition.get_port_type == :CALL then # :ENTRY ãªãã¨ã©ã¼ãç¡è¦ããªã4795 if @definition.get_port_type == :CALL then # :ENTRY ならエラー。無視しない 5048 4796 check_and_gen_through 5049 create_allocator_join # through ãã©ã°ã¤ã³çæããå¾ã§ãªãã¨ãæ¿å 5050 ¥åã®ã»ã«ã®ã¢ãã±ã¼ã¿ãçµåãã¦ãã¾ã 4797 create_allocator_join # through プラグイン生成した後でないと、挿入前のセルのアロケータを結合してしまう 5051 4798 end 5052 4799 elsif @definition == nil then … … 5057 4804 end 5058 4805 5059 #=== Join# å¤æ°ã®åæåãã§ãã¯4806 #=== Join# 変数の初期化チェック 5060 4807 def check_var_init 5061 # attribute, var ã®å ´å4808 # attribute, var の場合 5062 4809 if @definition.get_kind == :ATTRIBUTE then 5063 4810 # check_cell_cb_init( definition.get_type, @rhs ) 5064 # å³è¾ºã§åæåå¯è½ããã§ãã¯4811 # 右辺で初期化可能かチェック 5065 4812 @definition.get_type.check_init( @locale, @definition.get_identifier, @rhs, :ATTRIBUTE ) 5066 4813 elsif @definition.get_kind == :VAR then 5067 # var ã¯åæåã§ããªã4814 # var は初期化できない 5068 4815 cdl_error( "S1100 $1: cannot initialize var" , @name ) 5069 4816 else … … 5073 4820 end 5074 4821 5075 #=== Join# å¼ã³å£ã®åæåãã§ãã¯4822 #=== Join# 呼び口の初期化チェック 5076 4823 def check_call_port_init 5077 4824 ### Port 5078 4825 5079 # 左辺ã¯åãå£ãï¼åãå£ãåæåãããã¨ãã¦ããï¼ï¼4826 # 左辺は受け口か(受け口を初期化しようとしている)? 5080 4827 if @definition.get_port_type == :ENTRY then 5081 4828 cdl_error( "S1101 \'$1\' cannot initialize entry port" , @name ) … … 5083 4830 end 5084 4831 5085 # # é 5086 åæ·»æ°ã®æ´åæ§ãã§ã㯠5087 # # å¼ã³å£ã®å®ç¾©ã§ãéé 5088 åãªãæ·»æ°ãªããæ·»æ°ãªãé 5089 åãªãæ·»æ°ãªããæ·»æ°ããé 5090 åãªãæ·»æ°ãã 4832 # # 配列添数の整合性チェック 4833 # # 呼び口の定義で、非配列なら添数なし、添数なし配列なら添数なし、添数あり配列なら添数あり 5091 4834 as = @definition.get_array_size 5092 4835 if ( @subscript == nil && as != nil ) then … … 5111 4854 # end 5112 4855 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 # 右辺がない(以前の段階でエラー) 5128 4869 return unless @rhs 5129 4870 5130 # cCall = composite.cCall; ã®ãã§ãã¯ï¼ãã®å½¢å¼ã¯å±æ§ç¨5131 # å¼ã³å£ã export ããã«ã¯ cCall => composite.cCall; ã®å½¢å¼ãç¨ãã4871 # cCall = composite.cCall; のチェック.この形式は属性用 4872 # 呼び口を export するには cCall => composite.cCall; の形式を用いる 5132 4873 if @rhs.instance_of?( Array ) == true && @rhs[0] == :COMPOSITE then 5133 4874 cdl_error( "S1107 to export port, use \'cCall => composite.cCall\'" ) … … 5137 4878 end 5138 4879 5139 # å³è¾ºã® Expression ã®è¦ç´ ãåãåºã4880 # 右辺の Expression の要素を取り出す 5140 4881 ret = @rhs.analyze_cell_join_expression 5141 4882 if ret == nil then #1 … … 5145 4886 5146 4887 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 が返る 5153 4892 object = CompositeCelltype.find( @cell_name ) 5154 4893 if object == false then 5155 # mikan 左辺ã namespace ã«å¯¾å¿ãã¦ããªãããã path ã«ãã¦find4894 # mikan 左辺が namespace に対応していないため。 path にして find 5156 4895 # p nsp.get_path_str, nsp.get_path 5157 4896 object = Namespace.find( nsp ) #1 … … 5172 4911 object.set_f_ref 5173 4912 5174 # å³è¾ºã®ã»ã«ã®ã»ã«ã¿ã¤ã4913 # 右辺のセルのセルタイプ 5175 4914 celltype = object.get_celltype 5176 4915 … … 5185 4924 cdl_error( "S1113 \'$1\' signature mismatch" , @port_name ) 5186 4925 elsif object2.get_array_size then 5187 # åãå£é 5188 å 4926 # 受け口配列 5189 4927 5190 4928 unless @rhs_subscript then 5191 # å³è¾ºã«æ·»æ°æå®ããªãã£ã4929 # 右辺に添数指定がなかった 5192 4930 cdl_error( "S1114 \'$1\' should be array" , @port_name ) 5193 4931 else … … 5195 4933 as = object2.get_array_size 5196 4934 if( as.kind_of?( Integer ) && as <= @rhs_subscript )then 5197 # åãå£é 5198 åã®å¤§ããã«å¯¾ããå³è¾ºã®æ·»æ°ãåãã大ãã 4935 # 受け口配列の大きさに対し、右辺の添数が同じか大きい 5199 4936 cdl_error( "S1115 $1[$2]: subscript out of range (< $3)" , @port_name, @rhs_subscript, as ) 5200 4937 else … … 5203 4940 @celltype = celltype 5204 4941 @port = object2 5205 # å³è¾ºã®ã»ã«ã®åãå£ object2 ãåç 5206 §æ¸ã¿ã«ãã 4942 # 右辺のセルの受け口 object2 を参照済みにする 5207 4943 # object2: Port, @definition: Port 5208 4944 @cell.set_entry_port_max_subscript( @port, @rhs_subscript ) … … 5214 4950 end 5215 4951 elsif @rhs_subscript then 5216 # åãå£é 5217 åã§ãªãã®ã«å³è¾ºã§æ·»æ°æå®ããã¦ãã 4952 # 受け口配列でないのに右辺で添数指定されている 5218 4953 cdl_error( "S1116 \'$1\' entry port is not array" , @port_name ) 5219 4954 else … … 5223 4958 @celltype = celltype 5224 4959 5225 # å³è¾ºã®ã»ã« object ã®åãå£ object2 ãåç 5226 §æ¸ã¿ã«ãã 4960 # 右辺のセル object の受け口 object2 を参照済みにする 5227 4961 # object2: Port, @definition: Port 5228 4962 5229 4963 # debug 5230 4964 # p "rhs: #{@cell} #{@cell.get_name}" 5231 end # end of port (object2) ãã§ãã¯4965 end # end of port (object2) チェック 5232 4966 5233 4967 #else 5234 # celltype == nil ( ãã§ã«ã¨ã©ã¼)5235 end # end of celltyep ãã§ãã¯4968 # celltype == nil (すでにエラー) 4969 end # end of celltyep チェック 5236 4970 5237 4971 5238 4972 check_region( object ) 5239 4973 5240 end # end of cell (object) ãã§ãã¯5241 5242 end 5243 5244 #=== Join# ã¢ãã±ã¼ã¿ã®çµåãçæ4974 end # end of cell (object) チェック 4975 4976 end 4977 4978 #=== Join# アロケータの結合を生成 5245 4979 # STAGE: S 5246 #cell:: å¼ã³å£ã®çµåå 5247 ã®ã»ã« 4980 #cell:: 呼び口の結合先のセル 5248 4981 # 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 を参照 5254 4985 def create_allocator_join 5255 4986 5256 cell = get_rhs_cell2 # å³è¾ºã®ã»ã«ãå¾ã4987 cell = get_rhs_cell2 # 右辺のセルを得る 5257 4988 port = get_rhs_port2 5258 4989 5259 if( cell && cell.get_allocator_list ) then # cell == nil ãªãæ¢ã«ã¨ã©ã¼4990 if( cell && cell.get_allocator_list ) then # cell == nil なら既にエラー 5260 4991 5261 4992 dbgPrint "create_allocator_join: #{@owner.get_name}.#{@name}=>#{cell ? cell.get_name : "nil"}\n" … … 5264 4995 5265 4996 if( a[0+1] == port && a[1+1] == @rhs_subscript )then 5266 # ååã®ä¸è´ãããã®ã®çµåãçæãã5267 # éä¸è¶³ã¯ãå¥éãã§ãã¯ããã4997 # 名前の一致するものの結合を生成する 4998 # 過不足は、別途チェックされる 5268 4999 cp_name = :"#{@name}_#{a[2+1]}_#{a[3+1]}" 5269 5000 # p "creating allocator join #{cp_name} #{@subscript} #{a[1+1]}" … … 5280 5011 end 5281 5012 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 へたどり着くまでための処理に共通部分が多い 5287 5017 def check_region( object ) 5288 5018 … … 5291 5021 # print "DOMAIN: check_region #{@owner.get_name}.#{@name} => #{object.get_name}\n" 5292 5022 5293 # ãã©ã°ã¤ã³ã§çæããããªãã§ã¯çæããªã5294 # ãããªãã¨ãã©ã°ã¤ã³çæããããã®ã¨ã®éã§ãç¡éã«çæããã5023 # プラグインで生成されたなかでは生成しない 5024 # さもないとプラグイン生成されたものとの間で、無限に生成される 5295 5025 ## if Generator.get_nest >= 1 then 5296 ## if Generator.get_plugin then # mikan ããã¯å¿ 5297 è¦ï¼ (æå³è§£æ段éã§ã®å®è¡ã«ãªãã®ã§ä¸é©å) 5026 ## if Generator.get_plugin then # mikan これは必要? (意味解析段階での実行になるので不適切) 5298 5027 if @owner.get_plugin.kind_of?( ThroughPlugin ) then 5299 # ãã©ã°ã¤ã³çæãããã»ã«ã®å ´åãçµåãã§ãã¯ã®ã¿5028 # プラグイン生成されたセルの場合、結合チェックのみ 5300 5029 return 5301 5030 end 5302 5031 5303 # region ã®ãã§ãã¯5304 r1 = @owner.get_region # å¼ã³å£ã»ã«ã®region5305 r2 = object.get_region # åãå£ã»ã«ã®region5306 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 なら呼出し可能 5308 5037 5309 5038 f1 = r1.get_family_line … … 5312 5041 len2 = f2.length 5313 5042 5314 # ä¸ä¸è´ã«ãªãã¨ããï¼å 5315 å¼ï¼ãæ¢ã 5316 i = 1 # i = 0 㯠:RootRegion ãªã®ã§å¿ 5317 ãä¸è´ 5043 # 不一致になるところ(兄弟)を探す 5044 i = 1 # i = 0 は :RootRegion なので必ず一致 5318 5045 while( i < len1 && i < len2 ) 5319 5046 if( f1[i] != f2[i] )then … … 5323 5050 end 5324 5051 5325 sibling_level = i # å 5326 å¼ã¨ãªãã¬ãã«ããããã¯ã©ã¡ããä¸æ¹ãçµãã£ãã¬ãã« 5052 sibling_level = i # 兄弟となるレベル、もしくはどちらか一方が終わったレベル 5327 5053 5328 5054 dbgPrint "sibling_level: #{i}\n" … … 5337 5063 5338 5064 5339 # å¼ã³å´ã«ã¤ãã¦å¼ã³å 5340 ã®ã¬ãã«ããå 5341 å¼ã¬ãã«ã¾ã§ï¼out_through ããã§ãã¯ããã³æ¿å 5342 ¥ï¼ 5065 # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入) 5343 5066 i = len1 -1 5344 5067 if b_to_through then … … 5364 5087 5365 5088 out_through_list.each { |ol| 5366 if ol[0] then # plugin_name ãæå®ããã¦ããªããã°ç»é²ããªã5089 if ol[0] then # plugin_name が指定されていなければ登録しない 5367 5090 plugin_arg = CDLString.remove_dquote ol[1] 5368 5091 through = [ ol[0], :"Join_out_through_", plugin_arg, f1[i], f1[i-1], :OUT_THROUGH, region_count] … … 5377 5100 end 5378 5101 5379 # å 5380 å¼ã¬ãã«ã«ããã¦ï¼to_through ããã§ãã¯ããã³æ¿å 5381 ¥ï¼ 5102 # 兄弟レベルにおいて(to_through をチェックおよび挿入) 5382 5103 if f1[sibling_level] && f2[sibling_level] then 5383 5104 dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n" 5384 5105 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 カウント 5386 5107 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 が指定されていなければ登録しない 5389 5110 plugin_arg = CDLString.remove_dquote t[2] 5390 5111 through = [ t[1], :"Join_to_through__", plugin_arg, f1[sibling_level], f2[sibling_level], :TO_THROUGH, region_count ] … … 5409 5130 end 5410 5131 5411 # åãå´ã«ã¤ãã¦å 5412 å¼ã¬ãã«ããåãå´ã®ã¬ãã«ã¾ã§ï¼in_through ããã§ãã¯ããã³æ¿å 5413 ¥ï¼ 5132 # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入) 5414 5133 if b_to_through then 5415 i = sibling_level + 1 # to_through ãçµãå ´åãæåã® in_through ã¯é©ç¨ããªã5134 i = sibling_level + 1 # to_through を経た場合、最初の in_through は適用しない 5416 5135 else 5417 5136 i = sibling_level … … 5436 5155 end 5437 5156 in_through_list.each { |il| 5438 if il[0] then # plugin_name ãæå®ããã¦ããªããã°ç»é²ããªã5157 if il[0] then # plugin_name が指定されていなければ登録しない 5439 5158 plugin_arg = CDLString.remove_dquote il[1] 5440 5159 through = [ il[0], :"Join_in_through_", plugin_arg, f2[i-1], f2[i],:IN_THROUGH, region_count ] … … 5449 5168 5450 5169 5451 #=== Join# çæããªããªã¼ã¸ã§ã³ã¸ã®çµåããã§ãã¯5452 # å³è¾ºã®ã»ã«ããçæãããªããªã¼ã¸ã§ã³ã«ããã°ã¨ã©ã¼5453 # å³è¾ºã¯ããã©ã°ã¤ã³çæãããã»ã«ãããã°ãããã対象ã¨ãã5170 #=== Join# 生成しないリージョンへの結合かチェック 5171 # 右辺のセルが、生成されないリージョンにあればエラー 5172 # 右辺は、プラグイン生成されたセルがあれば、それを対象とする 5454 5173 def check_region2 5455 5174 lhs_cell = @owner 5456 5175 5457 # çæããªããªã¼ã¸ã§ã³ã®ã»ã«ã¸ã®çµåãï¼5176 # 生成しないリージョンのセルへの結合か? 5458 5177 # 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 セルがプロタイプ宣言の場合例外 5460 5179 # print "Link root: (caller #{@owner.get_name}) '#{@owner.get_region.get_link_root.get_name}'" 5461 5180 # print " #{@owner.get_region.get_link_root == get_rhs_region.get_link_root ? "==" : "!="} " … … 5470 5189 end 5471 5190 else 5472 # rhs ã®ã»ã«ãåå¨ããªãã£ã (æ¢ã«ã¨ã©ã¼)5191 # rhs のセルが存在しなかった (既にエラー) 5473 5192 end 5474 5193 end … … 5478 5197 end 5479 5198 5480 #=== Join# specifier ãè¨å®5199 #=== Join# specifier を設定 5481 5200 # 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 生成 5485 5204 def set_specifier_list( specifier_list ) 5486 5205 … … 5490 5209 # set plugin_name 5491 5210 plugin_name = s[1].to_s 5492 plugin_name[0] = "#{plugin_name[/^./].upcase}" # å 5493 é æåã大æåã« : ruby ã®ã¯ã©ã¹åã®å¶ç´ 5211 plugin_name[0] = "#{plugin_name[/^./].upcase}" # 先頭文字を大文字に : ruby のクラス名の制約 5494 5212 5495 5213 # set cell_name … … 5498 5216 # set plugin_arg 5499 5217 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' ) # 前後の "" を取り除く 5501 5219 # plugin_arg.sub!( /(.*)"\z/, '\1' ) 5502 5220 … … 5507 5225 end 5508 5226 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 # その後、このメソッドが呼ばれる 5513 5231 def check_and_gen_through 5514 5232 … … 5531 5249 5532 5250 @through_list = @cp_through_list + @region_through_list 5533 # å¾ãã @cp_through_list 㨠@region_through_list ã«åããããããã®ãããªå®è£ 5534 ã«ãªã£ã 5251 # 後から @cp_through_list と @region_through_list に分けたため、このような実装になった 5535 5252 5536 5253 if @through_list then # nil when the join is not Port 5537 len = @through_list.length # through ãé£æ¥ãã¦ããæ°5254 len = @through_list.length # through が連接している数 5538 5255 else 5539 5256 len = 0 … … 5546 5263 end 5547 5264 5548 # é£ç¶ãã through ã«ã¤ãã¦ãåãå£å´ããé ã«ã»ã«ãçæã解éãã5265 # 連続した through について、受け口側から順にセルを生成し解釈する 5549 5266 i = len - 1 5550 5267 while i >= 0 … … 5575 5292 5576 5293 else 5577 # æå¾ã®ã»ã«ã®å ´åã次ã®ã»ã«ã®ååããã¼ãå5294 # 最後のセルの場合、次のセルの名前、ポート名 5578 5295 next_cell = @cell 5579 5296 next_port_name = @port_name 5580 5297 5581 5298 if next_cell == nil then 5582 # çµåå 5583 ããªã 5299 # 結合先がない 5584 5300 return 5585 5301 end … … 5587 5303 5588 5304 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 がないか探す 5591 5307 # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762 5592 5308 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 # 共用しないようにするには、見つからなかったことにすればよい 5596 5311 # rp = nil 5597 5312 else 5598 # region 以å¤ã®ãã®ã¯å 5599 ±æããªã 5600 # å¼ã³å£å´ã«æå®ããã¦ããããplugin_arg ãç°ãªããããããªã 5313 # region 以外のものは共有しない 5314 # 呼び口側に指定されているし、plugin_arg が異なるかもしれない 5601 5315 rp = nil 5602 5316 end … … 5607 5321 end 5608 5322 else 5609 # è¦ã¤ãã£ããã®ãå 5610 ±ç¨ãã 5323 # 見つかったものを共用する 5611 5324 @through_generated_list[ i ] = rp 5612 5325 end 5613 5326 5614 5327 if i >= cp_len then 5615 # @through_generated_list ã®ãã¡ @region_through_listã«å¯¾å¿ããé¨å5328 # @through_generated_list のうち @region_through_listに対応する部分 5616 5329 @region_through_generated_list[ i - cp_len ] = @through_generated_list[ i ] 5617 5330 if rp == nil then 5618 # çæãããã®ã region(@through_list[i][3]) ã®ãªã¹ãã«è¿½å5331 # 生成したものを region(@through_list[i][3]) のリストに追加 5619 5332 # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762 5620 5333 @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @through_generated_list[i] ) … … 5623 5336 5624 5337 if i == 0 then 5625 # æãå¼ã³å£å´ã®ã»ã«ã¯ãCDL ä¸ã®çµåããªããããåç 5626 §ããããã¨ã«ãªããªã 5627 # mikan namespace å¯¾å¿ 5338 # 最も呼び口側のセルは、CDL 上の結合がないため、参照されたことにならない 5339 # mikan namespace 対応 5628 5340 # cell = Namespace.find( [ @through_generated_list[0].get_cell_name] ) #1 5629 5341 if @through_generated_list[0] == nil then 5630 return # plugin_object ã®çæã«å¤±æãã¦ãã5342 return # plugin_object の生成に失敗している 5631 5343 end 5632 5344 cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path ) #1 … … 5652 5364 end 5653 5365 5654 #=== Join# through ãã©ã°ã¤ã³ãå¼ã³åºã㦠CDL çæãããã¨ã¨ãã«ãimport ãã5366 #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する 5655 5367 def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name ) 5656 5368 … … 5660 5372 plugin_arg = through[ 2 ] 5661 5373 if through[ 3 ] then 5662 # region éã® through ã®å ´å5374 # region 間の through の場合 5663 5375 @@start_region = through[ 3 ] 5664 5376 if next_cell.get_region.equal? @@start_region then … … 5670 5382 @@region_count = through[ 6 ] 5671 5383 else 5672 # å¼ã³å£ã® through ã®å ´å5673 @@start_region = @owner.get_region # å¼ã³å£å´ã»ã«ã®region5674 @@end_region = next_cell.get_region # 次ã®ã»ã«ã®region5675 @@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 指定 5676 5388 @@region_count = 0 5677 5389 end … … 5687 5399 5688 5400 begin 5689 eval( eval_str ) # plugin ãçæ5401 eval( eval_str ) # plugin を生成 5690 5402 plugin_object.set_locale @locale 5691 5403 rescue Exception => evar … … 5702 5414 @through_generated_list[ i ] = plugin_object 5703 5415 5704 # Region ã«é¢ããæ 5705 å ±ãè¨å® 5706 # å¾ãã追å ããã®ã§ãnew ã®å¼æ°å¤ã§è¨å® 5416 # Region に関する情報を設定 5417 # 後から追加したので、new の引数外で設定 5707 5418 # plugin_object.set_through_info( start_region, end_region, through_type ) 5708 5419 … … 5710 5421 end 5711 5422 5712 # ãã©ã°ã¤ã³ã¸ã®å¼æ°ã§æ¸¡ããªããã®ããä¸æçã«è¨æ¶ãã¦ãã5713 # ãã©ã°ã¤ã³ã® initialize ã®ä¸ã§ã³ã¼ã«ããã¯ãã¦è¨å®ãã5423 #プラグインへの引数で渡さないものを、一時的に記憶しておく 5424 # プラグインの initialize の中でコールバックして設定する 5714 5425 @@plugin_creating_join = nil 5715 5426 @@start_region = nil … … 5718 5429 @@region_count = nil 5719 5430 5720 #=== Join# ThroughPlugin ã®è¿½å æ 5721 å ±ãè¨å®ãã 5722 # ãã®ã¡ã½ãã㯠ThroughPlugin#initialize ããå¼ã³åºããã 5723 # plugin_object ãçæããéã®å¼æ°ã§ã¯ä¸è¶³ããæ 5724 å ±ã追å ãã 5431 #=== Join# ThroughPlugin の追加情報を設定する 5432 # このメソッドは ThroughPlugin#initialize から呼び出される 5433 # plugin_object を生成する際の引数では不足する情報を追加する 5725 5434 def self.set_through_info plugin_object 5726 5435 plugin_object.set_through_info( @@start_region, @@end_region, @@through_type, … … 5734 5443 end 5735 5444 5736 #=== Join#é 5737 åæ·»æ°ãå¾ã 5738 # @subscript ã®èª¬æãåç 5739 §ã®ã㨠5445 #=== Join#配列添数を得る 5446 # @subscript の説明を参照のこと 5740 5447 def get_subscript 5741 5448 @subscript 5742 5449 end 5743 5450 5744 def get_cell_name # åãå£ã»ã«å5451 def get_cell_name # 受け口セル名 5745 5452 @cell_name 5746 5453 end … … 5754 5461 end 5755 5462 5756 #=== Join# å³è¾ºã®å®ã»ã«ãå¾ã 5757 # å®ã»ã«ã¨ã¯ through ã§æ¿å 5758 ¥ããããã®ãcomposite ã®å 5759 é¨ãªã©å®éã«çµåãããå 5760 5761 # ãã®ã¡ã½ããã¯ãget_rhs_port ã¨å¯¾ã«ãªã£ã¦ãã 5762 # ãã®ã¡ã½ããã¯ãæå³è§£æ段éã§ã¯å¼ã³åºãã¦ã¯ãªããªã (対象ã»ã«ã®æå³è§£æãæ¸ãåã«ã¯æ£ããçµæãè¿ããªã) 5463 #=== Join# 右辺の実セルを得る 5464 # 実セルとは through で挿入されたもの、composite の内部など実際に結合される先 5465 # このメソッドは get_rhs_port と対になっている 5466 # このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない) 5763 5467 def get_rhs_cell 5764 # through æå®ããï¼5468 # through 指定あり? 5765 5469 if @through_list[0] then 5766 # mikan through ã§çæãããã®ã root namespace éå®5470 # mikan through で生成したものが root namespace 限定 5767 5471 if @through_generated_list[0] then 5768 5472 # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] ) #1 5769 5473 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 をはじいた方がよい。 5773 5477 return cell.get_real_cell( @through_generated_list[0].get_through_entry_port_name ) 5774 5478 else 5775 return nil # generate ã«å¤±æãã¦ãã5479 return nil # generate に失敗している 5776 5480 end 5777 5481 elsif @cell then 5778 5482 return @cell.get_real_cell( @port_name ) 5779 5483 else 5780 # å³è¾ºãæªå®ç¾©ã®å ´å @cell 㯠nil (æ¢ã«ã¨ã©ã¼)5484 # 右辺が未定義の場合 @cell は nil (既にエラー) 5781 5485 return nil 5782 5486 end 5783 5487 end 5784 5488 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 と対になっている 5790 5494 def get_rhs_cell2 5791 # through æå®ããï¼5495 # through 指定あり? 5792 5496 if @through_list[0] then 5793 # mikan through ã§çæãããã®ã root namespace éå®5497 # mikan through で生成したものが root namespace 限定 5794 5498 # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name ] ) 5795 5499 if @through_generated_list[0] then … … 5797 5501 cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path ) #1 5798 5502 else 5799 cell = @cell # generate ã«å¤±æãã¦ãã5503 cell = @cell # generate に失敗している 5800 5504 end 5801 5505 else … … 5806 5510 end 5807 5511 5808 #=== Join# å³è¾ºã®ã»ã«ãå¾ã5809 # through ã¯é©ç¨ããªãããcomposite ã¯å±éããå¾ã®ã»ã«5810 # ( æå³è§£æãçµãã£ã¦ããªãã¨ãcomposite å±éãçµãã£ã¦ããªã)5811 # ãã®ã¡ã½ãã㯠get_rhs_port3 ã¨å¯¾ã«ãªã£ã¦ãã5512 #=== Join# 右辺のセルを得る 5513 # through は適用しないが、composite は展開した後のセル 5514 # (意味解析が終わっていないと、composite 展開が終わっていない) 5515 # このメソッドは get_rhs_port3 と対になっている 5812 5516 def get_rhs_cell3 5813 5517 if @cell then … … 5816 5520 end 5817 5521 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 の例外となる 5822 5526 def get_rhs_region 5823 # through æå®ããï¼5527 # through 指定あり? 5824 5528 if @through_list[0] then 5825 5529 if @through_generated_list[0] then 5826 # mikan through ã§çæãããã®ã root namespace éå®5530 # mikan through で生成したものが root namespace 限定 5827 5531 # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] ) #1 5828 5532 cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path ) #1 … … 5831 5535 end 5832 5536 else 5833 return nil # generate ã«å¤±æãã¦ãã5537 return nil # generate に失敗している 5834 5538 end 5835 5539 elsif @cell then 5836 5540 return @cell.get_region 5837 5541 end 5838 # å³è¾ºãæªå®ç¾©ã®å ´å @cell 㯠nil (æ¢ã«ã¨ã©ã¼)5542 # 右辺が未定義の場合 @cell は nil (既にエラー) 5839 5543 return nil 5840 5544 end 5841 5545 5842 def get_cell_global_name # åãå£ã»ã«åï¼ã³ã³ãã¸ãããªãå±éããå 5843 å´ã®ã»ã«ï¼ 5546 def get_cell_global_name # 受け口セル名(コンポジットなら展開した内側のセル) 5844 5547 5845 5548 # debug … … 5855 5558 end 5856 5559 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 ) # 受け口名(コンポジットなら展開した内側のセル) 5864 5564 5865 5565 # debug 5866 5566 dbgPrint "Cell get_port_global_name: #{@cell_name}\n" 5867 5567 5868 # through æå®ããï¼5568 # through 指定あり? 5869 5569 if @through_list[0] then 5870 5570 5871 # mikan through ã§çæãããã®ã root namespace éå®5571 # mikan through で生成したものが root namespace 限定 5872 5572 # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] ) #1 5873 5573 cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path ) #1 5874 5574 5875 # through ã§æ¿å 5876 ¥ãããã»ã«ã§ãå®éã«æ¥ç¶ãããã»ã«ï¼compositeã®å ´åå 5877 é¨ã®)ã®åãå£ã® C è¨èªåå 5575 # through で挿入されたセルで、実際に接続されるセル(compositeの場合内部の)の受け口の C 言語名前 5878 5576 return cell.get_real_global_port_name( @through_generated_list[0].get_through_entry_port_name ) 5879 5577 else 5880 5578 5881 # å®éã«æ¥ç¶ãããã»ã«ã®åãå£ã® C è¨èªåå5579 # 実際に接続されるセルの受け口の C 言語名前 5882 5580 if @cell then 5883 5581 return @cell.get_real_global_port_name( @port_name ) … … 5902 5600 end 5903 5601 5904 #=== Join# å³è¾ºã®ãã¼ããå¾ã 5905 # å³è¾ºã composite ã®å ´åã¯ãå 5906 é¨ã®ç¹ããã»ã«ã®ãã¼ã, through ã®å ´åã¯æ¿å 5907 ¥ãããã»ã«ã®ãã¼ã 5908 # ãã®ã¡ã½ãã㯠get_rhs_cell ã¨å¯¾ã«ãªã£ã¦ãã 5602 #=== Join# 右辺のポートを得る 5603 # 右辺が composite の場合は、内部の繋がるセルのポート, through の場合は挿入されたセルのポート 5604 # このメソッドは get_rhs_cell と対になっている 5909 5605 def get_rhs_port 5910 # through æå®ããï¼5606 # through 指定あり? 5911 5607 if @through_list[0] then 5912 # mikan through ã§çæãããã®ã root namespace éå®5913 # through ã§çæãããã»ã«ãæ¢ã5608 # mikan through で生成したものが root namespace 限定 5609 # through で生成されたセルを探す 5914 5610 # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] ) #1 5915 5611 cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path ) #1 5916 # cell ã®ãã©ã°ã¤ã³ã§çæããããã¼ãåã®ãã¼ããæ¢ã (composite ãªãå 5917 é¨ã®ç¹ãããã¼ã) 5612 # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート) 5918 5613 return cell.get_real_port( @through_generated_list[0].get_through_entry_port_name ) 5919 5614 else 5920 # ãã¼ããè¿ã(composite ãªãå 5921 é¨ã®ç¹ãããã¼ããè¿ã) 5615 # ポートを返す(composite なら内部の繋がるポートを返す) 5922 5616 return @cell.get_real_port( @port_name ) 5923 5617 end 5924 5618 end 5925 5619 5926 #=== Join# å³è¾ºã®ãã¼ããå¾ã5927 # å³è¾ºã®ãã¼ããå¾ãã5928 # ããã¯ãããã¿ã¤ã宣è¨ããããã¦ããªãå ´åã«ã¯ããã¡ããã使ããªã5620 #=== Join# 右辺のポートを得る 5621 # 右辺のポートを得る。 5622 # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない 5929 5623 def get_rhs_port2 5930 # through æå®ããï¼5624 # through 指定あり? 5931 5625 if @through_list[0] then 5932 5626 if @through_generated_list[0] then 5933 5627 port = @through_generated_list[0].get_through_entry_port_name.to_sym 5934 5628 else 5935 port = @port_name # generate ã«å¤±æãã¦ãã5629 port = @port_name # generate に失敗している 5936 5630 end 5937 5631 else … … 5942 5636 end 5943 5637 5944 #=== Join# å³è¾ºã®ãã¼ããå¾ã5945 # through ã¯é©ç¨ããªãããcomposite ã¯å±éããå¾ã®ã»ã«ã®å¯¾å¿ãããã¼ã5638 #=== Join# 右辺のポートを得る 5639 # through は適用しないが、composite は展開した後のセルの対応するポート 5946 5640 def get_rhs_port3 5947 5641 if @cell then … … 5950 5644 end 5951 5645 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 5962 5650 def add_array_member join2 5963 5651 5964 # subscript2: join2 ã®å·¦è¾ºæ·»æ°5652 # subscript2: join2 の左辺添数 5965 5653 subscript2 = join2.get_subscript 5966 5654 5967 5655 if @subscript == nil then # not array : initialize duplicate 5968 # éé 5969 åã®å ´åãjoin ãéè¤ãã¦ãã 5656 # 非配列の場合、join が重複している 5970 5657 cdl_error( "S1127 \'$1\' duplicate", @name ) 5971 5658 # print "add_array_member2: #{@owner.get_name}\n" 5972 5659 5973 5660 elsif @subscript >= 0 then 5974 # æ·»æ°æå®ããã®å ´å5661 # 添数指定ありの場合 5975 5662 if( subscript2 == nil || subscript2 < 0 ) then 5976 # join2 左辺ã¯éé 5977 åã¾ãã¯æ·»æ°ãªã 5978 # é 5979 åãä¸ä¸è´ 5663 # join2 左辺は非配列または添数なし 5664 # 配列が不一致 5980 5665 cdl_error( "S1128 \'$1\' inconsistent array definition", @name ) 5981 5666 elsif @array_member[subscript2] != nil then 5982 # åãæ·»æ°ãæ¢ã«å®ç¾©æ¸ã¿5667 # 同じ添数が既に定義済み 5983 5668 cdl_error( "S1129 \'$1\' redefinition of subscript $2" ,@name, subscript2 ) 5984 5669 else 5985 # æ·»æ°ã®ä½ç½®ã«è¦ç´ ã追å5670 # 添数の位置に要素を追加 5986 5671 @array_member[subscript2] = join2.get_rhs 5987 5672 @array_member2[subscript2] = join2 … … 5990 5675 5991 5676 else 5992 # æ·»æ°æå®ãªãã®å ´å5677 # 添数指定なしの場合 5993 5678 if( subscript2 == nil || subscript2 >= 0 ) then 5994 # join2 左辺ã¯éé 5995 åã¾ãã¯æ·»æ°æ 5996 # é 5997 åãä¸ä¸è´ 5679 # join2 左辺は非配列または添数有 5680 # 配列が不一致 5998 5681 cdl_error( "S1130 \'R1\' inconsistent array definition", @name ) 5999 5682 end 6000 5683 6001 # æ·»æ°ãªãé 6002 åã®å ´åãé 6003 åè¦ç´ ã追å 5684 # 添数なし配列の場合、配列要素を追加 6004 5685 @array_member << join2.get_rhs 6005 5686 @array_member2 << join2 … … 6025 5706 while i < @array_member2.length 6026 5707 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 では対策している) 6031 5711 @array_member2[i].change_name( name ) 6032 5712 end … … 6036 5716 end 6037 5717 6038 # composite cell ãå±éããã»ã«ã®çµåã clone ããã»ã«ã®ååã«å¤æ´5718 # composite cell を展開したセルの結合を clone したセルの名前に変更 6039 5719 def change_rhs_port( clone_cell_list, celltype ) 6040 5720 … … 6054 5734 dbgPrint " cell_name: #{@cell_name} => #{c.get_global_name}, #{c.get_name}\n" 6055 5735 6056 # @rhs ã®å 6057 容ã調æ´ãã¦ããï¼ãã®å 6058 容ã¯ãsubscript ãé¤ãã¦ãå¾ãã使ããã¦ããªãï¼ 5736 # @rhs の内容を調整しておく(この内容は、subscript を除いて、後から使われていない) 6059 5737 elements = @rhs.get_elements 6060 if elements[0] == :OP_SUBSC then # å³è¾ºï¼åãå£é 6061 åï¼ 5738 if elements[0] == :OP_SUBSC then # 右辺:受け口配列? 6062 5739 elements = elements[1] 6063 5740 end 6064 5741 6065 # å³è¾ºããcell.ePort ã®å½¢å¼ã§ãªã5742 # 右辺が cell.ePort の形式でない 6066 5743 if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER then #1 6067 5744 return 6068 5745 else 6069 # ã»ã«åã composite å 6070 é¨ã®ååãããå¤é¨ã®ååã«å 6071 ¥ãæ¿ãã 5746 # セル名を composite 内部の名前から、外部の名前に入れ替える 6072 5747 # elements[1][1] = Token.new( c.get_name, nil, nil, nil ) 6073 5748 elements[1][1] = NamespacePath.new( c.get_name, false, c.get_namespace ) … … 6076 5751 @cell_name = c.get_name 6077 5752 @cell = c 6078 # @definition = nil # @definition ãæå¹ï¼ ãã§ãã¯æ¸ã¿ï¼ã¨ã¯ãããªãï¼5753 # @definition = nil # @definition が有効: チェック済み(とは、しない) 6079 5754 6080 5755 if @array_member2 then … … 6085 5760 i = 0 6086 5761 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 では対策している) 6091 5765 if @array_member2[i] != self && @array_member[i] != nil then 6092 5766 @array_member2[i].change_rhs_port( clone_cell_list, celltype ) … … 6098 5772 end 6099 5773 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 などもコピーされるので、これが呼び出される前に確定する必要がある 6108 5780 def clone_for_composite( ct_name, cell_name, locale, b_need_recursive = true ) 6109 5781 … … 6125 5797 6126 5798 def clone_array_member( array_member, array_member2, ct_name, cell_name, prev, locale ) 6127 # é 6128 åã®ã³ãã¼ãä½ã 5799 # 配列のコピーを作る 6129 5800 am = array_member.clone 6130 5801 am2 = array_member2.clone 6131 5802 6132 # é 6133 åè¦ç´ ã®ã³ãã¼ãä½ã 5803 # 配列要素のコピーを作る 6134 5804 i = 0 6135 5805 while i < am2.length 6136 5806 if array_member2[i] == prev then 6137 # èªåèªèº«ã§ããï¼ã®ã§ãå¼åºãã¨ç¡éå帰å¼åºãã¨ãªãï¼5807 # 自分自身である(ので、呼出すと無限再帰呼出しとなる) 6138 5808 am2[i] = self 6139 5809 elsif array_member2[i] then 6140 5810 am2[i] = array_member2[i].clone_for_composite( ct_name, cell_name, locale, false ) 6141 5811 else 6142 # 以åã®ã¨ã©ã¼ã§ array_member2[i] 㯠nil ã«ãªã£ã¦ãã5812 # 以前のエラーで array_member2[i] は nil になっている 6143 5813 end 6144 5814 … … 6149 5819 end 6150 5820 6151 # i = 0 ã¯ãããã§èªåèªèº«ãè¨å®5821 # i = 0 は、ここで自分自身を設定 6152 5822 # am2[0] = self 6153 5823 … … 6157 5827 end 6158 5828 6159 #=== Join# rhs ãå 6160 ¥ãæãã 5829 #=== Join# rhs を入れ換える 6161 5830 #rhs:: Expression | initializer 6162 # å³è¾ºãå 6163 ¥ãæããï¼ 6164 # ãã®ã¡ã½ããã¯ãcomposite 㧠cell ã®å±æ§ã®åæå¤ã attribute ã®å¤ã§ç½®ãæããã®ã«ä½¿ããã 6165 # ãã®ã¡ã½ãã㯠composite å 6166 ã® cell ã®å±æ§ã®åæå¤ãå®æ°ã§ã¯ãªãå¼ã«ãªã£ãå ´åãä¸è¦ã«ãªã 5831 # 右辺を入れ換える. 5832 # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる 5833 # このメソッドは composite 内の cell の属性の初期値が定数ではなく式になった場合、不要になる 6167 5834 def change_rhs rhs 6168 5835 @rhs = rhs 6169 5836 end 6170 5837 6171 #=== Join# clone ããã join ã® owner ãå¤æ´5838 #=== Join# clone された join の owner を変更 6172 5839 def set_cloned( owner ) 6173 5840 dbgPrint "Join#set_cloned: #{@name} prev owner: #{@owner.get_name} new owner: #{owner.get_name}\n" … … 6255 5922 end 6256 5923 6257 #== éçµå5924 #== 逆結合 6258 5925 class ReverseJoin < BDNode 6259 5926 #@ep_name:: Symbol … … 6280 5947 end 6281 5948 6282 # CLASS: CompositeCelltype ç¨ã®Join6283 # REM: CompositeCelltype ã export ãããã®5949 # CLASS: CompositeCelltype 用の Join 5950 # REM: CompositeCelltype が export するもの 6284 5951 class 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セル) 6292 5956 # @port_decl:: Port | Decl 6293 5957 # @b_pseudo: bool : … … 6304 5968 end 6305 5969 6306 #=== CompositeCelltypeJoin# CompositeCelltypeJoin ã®å¯¾è±¡ã»ã«ãï¼6307 #cell:: Cell 対象ãã©ãããã§ãã¯ããã»ã«5970 #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか? 5971 #cell:: Cell 対象かどうかチェックするセル 6308 5972 # 6309 # CompositeCelltypeJoin 㨠cell ã®ååãä¸è´ããããã§ãã¯ãã6310 # port_decl ãæå®ãããå ´åã¯ãç¾ç¶ä½¿ããã¦ããªã5973 # CompositeCelltypeJoin と cell の名前が一致するかチェックする 5974 # port_decl が指定された場合は、現状使われていない 6311 5975 def match?( cell, port_decl = nil ) 6312 5976 … … 6324 5988 6325 5989 # if @cell.equal?( cell ) && ( port_decl == nil || @port_decl.equal?( port_decl ) ) then 6326 # ãªã port_decl ãä¸è´ããªããã°ãªããªãã£ããå¿ããã6327 # recursive_composite ã§ååã®ä¸è´ã«å¤æ´0609175990 # なぜ port_decl が一致しなければならなかったか忘れた。 5991 # recursive_composite で名前の一致に変更 060917 6328 5992 if((@cell.get_name == cell.get_name) && (port_decl == nil || @port_decl.get_name == port_decl.get_name))then 6329 5993 true … … 6357 6021 end 6358 6022 6359 # @port_decl ã Port ã®å ´åã®ã¿å¼ã³åºãã¦ãã6023 # @port_decl が Port の場合のみ呼び出してよい 6360 6024 def get_port_type 6361 6025 if @port_decl then … … 6379 6043 end 6380 6044 6381 # @port_decl ã Port ã®å ´åã®ã¿å¼ã³åºãã¦ãã6045 # @port_decl が Port の場合のみ呼び出してよい 6382 6046 def is_require? 6383 6047 if @port_decl then … … 6386 6050 end 6387 6051 6388 # @port_decl ã Port ã®å ´åã®ã¿å¼ã³åºãã¦ãã6052 # @port_decl が Port の場合のみ呼び出してよい 6389 6053 def is_allocator_port? 6390 6054 if @port_decl then … … 6393 6057 end 6394 6058 6395 # @port_decl ã Port ã®å ´åã®ã¿å¼ã³åºãã¦ãã6059 # @port_decl が Port の場合のみ呼び出してよい 6396 6060 def is_optional? 6397 6061 if @port_decl then … … 6400 6064 end 6401 6065 6402 #=== CompositeCelltypeJoin# å³è¾ºã Decl ãªãã°åæååï¼å¼ï¼ãè¿ã6403 # ãã®ã¡ã½ãã㯠Cell ã® check_join ããåæå¤ãã§ãã¯ã®ããã«å¼ã³åºããã6066 #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す 6067 # このメソッドは Cell の check_join から初期値チェックのために呼び出される 6404 6068 def get_initializer 6405 6069 if @port_decl.instance_of? Decl then … … 6414 6078 end 6415 6079 6416 #=== CompositeCelltypeJoin# é 6417 åãµã¤ãºãå¾ã 6418 #RETURN:: nil: not array, "[]": 大ããæå®ãªã, Integer: 大ããæå®ãã 6080 #=== CompositeCelltypeJoin# 配列サイズを得る 6081 #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり 6419 6082 def get_array_size 6420 6083 @port_decl.get_array_size 6421 6084 end 6422 6085 6423 #=== CompositeCelltypeJoin# signature ãå¾ã6424 # @port_decl ã Port ã®æã®ã¿å¼ã³åºãã¦ããã6086 #=== CompositeCelltypeJoin# signature を得る 6087 # @port_decl が Port の時のみ呼び出してもよい 6425 6088 def get_signature 6426 6089 @port_decl.get_signature … … 6465 6128 # @file_name:: string 6466 6129 # @format:: string 6467 # @arg_list:: Expression ã® elements ã¨åãå½¢å¼[ [:IDENTIFIER, String], ... ]6130 # @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ] 6468 6131 # @f_celltype:: bool : true: celltype factory, false: cell factory 6469 6132 … … 6476 6139 case name 6477 6140 when :write 6478 # write é¢æ°6141 # write 関数 6479 6142 @name = name 6480 6143 6481 # write é¢æ°ã®ç¬¬ä¸å¼æ°ï¼åºåå 6482 ãã¡ã¤ã«å 6483 # å¼ãè©ä¾¡ããï¼é常åä¸ã®æååã§ãããããåä¸ã®æååãè¿ãããï¼ 6144 # write 関数の第一引数:出力先ファイル名 6145 # 式を評価する(通常単一の文字列であるから、単一の文字列が返される) 6484 6146 @file_name = file_name.eval_const(nil).val # file_name : Expression 6485 6147 if ! @file_name.instance_of?( String ) then 6486 # æååå®æ°ã§ã¯ãªãã£ã6148 # 文字列定数ではなかった 6487 6149 cdl_error( "S1132 $1: 1st parameter is not string(file name)" , @name ) 6488 6150 @file_name = nil 6489 6151 end 6490 6152 6491 # write é¢æ°ã®ç¬¬äºå¼æ°ï¼ãã©ã¼ãããæåå6153 # write 関数の第二引数:フォーマット文字列 6492 6154 @format = format.eval_const(nil).val # format : Expression 6493 # å¼ãè©ä¾¡ããï¼é常åä¸ã®æååã§ãããããåä¸ã®æååãè¿ãããï¼6155 # 式を評価する(通常単一の文字列であるから、単一の文字列が返される) 6494 6156 if ! @format.instance_of?( String ) then 6495 # æååå®æ°ã§ã¯ãªãã£ã6157 # 文字列定数ではなかった 6496 6158 cdl_error( "S1133 $1: 2nd parameter is not string(fromat)" , @name ) 6497 6159 @format = nil 6498 6160 end 6499 6161 6500 # 第ä¸å¼æ°ä»¥éãå¼æ°ãªã¹ãã¨ãã mikan å¼æ°ã®ãã§ãã¯6162 # 第三引数以降を引数リストとする mikan 引数のチェック 6501 6163 @arg_list = arg_list 6502 6164 … … 6575 6237 #== Domain 6576 6238 # 6577 # region ã® domain ãè¨æ¶ããã¯ã©ã¹6239 # region の domain を記憶するクラス 6578 6240 class DomainType < Node 6579 #@name::Symbol : ãã¡ã¤ã³ã¿ã¤ãã®ååex) HRP26241 #@name::Symbol : ドメインタイプの名前 ex) HRP2 6580 6242 #@region::Region 6581 6243 #@plugin_name::Symbol : ex) HRP2Plugin 6582 6244 #@option::String : ex) "trusted", "nontrusted" 6583 #@plugin::DomainPlugin ã®åã¯ã©ã¹6245 #@plugin::DomainPlugin の子クラス 6584 6246 6585 6247 include PluginModule 6586 6248 6587 # ãã¡ã¤ã³ã«å±ãã region ã®Hash6588 # domain æå®ãä¸åº¦ãè¡ãããªãå ´åããã®ãªã¹ãã¯ç©ºã§ãã6589 # ã«ã¼ããªã¼ã¸ã§ã³ã¯ option = "OutOfDomain" ã§ç»é²ããã (domain æå®ãç¡ããã°ç»é²ãããªã)6249 # ドメインに属する region の Hash 6250 # domain 指定が一度も行われない場合、このリストは空である 6251 # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない) 6590 6252 @@domain_regions = { } # { :domain_type => [ region, ... ] } 6591 6253 … … 6628 6290 end 6629 6291 6630 #== Domain ãªã¼ã¸ã§ã³ã® Hash ãå¾ã 6631 # @@domain_regions ã®èª¬æåç 6632 § 6292 #== Domain リージョンの Hash を得る 6293 # @@domain_regions の説明参照 6633 6294 def self.get_domain_regions 6634 6295 return @@domain_regions … … 6649 6310 end 6650 6311 6651 #== Region ã¯ã©ã¹6312 #== Region クラス 6652 6313 # 6653 # Region 㯠Namespace ãç¶æ¿ãã¦ãã6654 # root region ã¯ç¹æ®ã§ãroot namespace ã¨åãã§ãã6314 # Region は Namespace を継承している 6315 # root region は特殊で、root namespace と同じである 6655 6316 # 6656 # cell 㯠region ã«å±ãã6657 # region ã«å±ãã cell ã®ãªã¹ã㯠Namespace ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã¨ãã¦è¨æ¶ããã6317 # cell は region に属する 6318 # region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される 6658 6319 # 6659 6320 class Region < Namespace 6660 6321 # @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 禁止 6663 6324 # @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 プラグインで生成されたオブジェクト 6666 6327 # @region_type::Symbol : :NODE, :LINKUNIT, :DOMAIN, :CLASS 6667 # @region_type_param::Symbol : domain, class ã®åå. node, linkunit ã§ã¯nil6668 # @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 æå®ããã¦ããªãå ´åãnil6674 # @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) 6675 6336 6676 6337 @@in_through_list = [] … … 6680 6341 @@region_type_param = nil 6681 6342 @@domain_name = nil 6682 @@domain_option = nil # Token ãå 6683 ¥ã 6343 @@domain_option = nil # Token が入る 6684 6344 6685 6345 @@link_roots = [] 6686 6346 6687 6347 def initialize( name ) 6688 # mikan name ã® Namespace 修飾6689 # object = Namespace.find( [ name ] ) # 親ã¾ã§æãã«ãã6348 # mikan name の Namespace 修飾 6349 # object = Namespace.find( [ name ] ) # 親まで捜しにいく 6690 6350 if name != "::" then 6691 6351 object = Namespace.get_current.find( name ) #1 6692 6352 else 6693 # root ãªã¼ã¸ã§ã³6353 # root リージョン 6694 6354 object = nil 6695 6355 @@region_type = :NODE … … 6727 6387 dbgPrint "Region.new: re-appear #{@name}\n" 6728 6388 6729 # # Region path ãåååºç¾ã¨ä¸è´ãããï¼6389 # # Region path が前回出現と一致するか? 6730 6390 # if @@region_stack[ @@region_stack_sp - 1 ] then 6731 6391 # my_path = @@region_stack[ @@region_stack_sp - 1 ].get_path_string.to_s + "." + @name.to_s … … 6737 6397 # end 6738 6398 6739 # ååºç¾6399 # 再出現 6740 6400 # @@region_stack[@@region_stack_sp] = object 6741 6401 6742 # ååºç¾æã« specifier ãæå®ããã¦ãããï¼6402 # 再出現時に specifier が指定されているか? 6743 6403 if( @in_through_list.length != 0 || @out_through_list.length != 0 || @to_through_list.length != 0 || @region_type != nil )then 6744 6404 cdl_error( "S1140 $1: region specifier must place at first appearence" , name ) … … 6747 6407 6748 6408 else 6749 # ã¨ã©ã¼ç¨ããã¼å®ç¾©6750 6751 # ç°ãªãååã®ãªãã¸ã§ã¯ããå®ç¾©æ¸ã¿6409 # エラー用ダミー定義 6410 6411 # 異なる同名のオブジェクトが定義済み 6752 6412 cdl_error( "S1141 $1 duplication, previous one : $2" , name, object.class ) 6753 # @@region_stack[@@region_stack_sp] = self # ã¨ã©ã¼ææ«å®region6754 end 6755 else 6756 # ååºç¾6413 # @@region_stack[@@region_stack_sp] = self # エラー時暫定 region 6414 end 6415 else 6416 # 初出現 6757 6417 dbgPrint "Region.new: #{@name}\n" 6758 6418 set_region_family_line … … 6807 6467 end 6808 6468 6809 #== Region ã«ã¼ããªã¼ã¸ã§ã³ãå¾ã6810 # ã«ã¼ããªã¼ã¸ã§ã³ã¯ãã«ã¼ããã¼ã ã¹ãã¼ã¹ã¨åãã§ãã6469 #== Region ルートリージョンを得る 6470 # ルートリージョンは、ルートネームスペースと同じである 6811 6471 def self.get_root 6812 6472 Namespace.get_root … … 6816 6476 6817 6477 dbgPrint "set_region_family_line: Region: #{@name} \n" 6818 # root namespace (root region) ã® region type ã¯:NODE6478 # root namespace (root region) の region type は :NODE 6819 6479 if @name == "::" then 6820 6480 @region_type = :NODE … … 6834 6494 6835 6495 if @domain_type then 6836 # ã«ã¼ããªã¼ã¸ã§ã³ãæåãã @domain_type è¨å®ããããã¨ã¯ãªãã® 6837 # 㧠@owner == nil ã調ã¹ãå¿ 6838 è¦ã¯ãªã 6496 # ルートリージョンが最初から @domain_type 設定されることはないの 6497 # で @owner == nil を調べる必要はない 6839 6498 @owner.set_domain_type @domain_type 6840 6499 end … … 6850 6509 @link_root = nil 6851 6510 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 で再設定 6860 6516 obj = self 6861 6517 while 1 … … 6868 6524 end 6869 6525 else 6870 # ãããªããã°Namespace6871 # namespace ã®ä¸ã« region ãããå ´å6872 end 6873 6874 # root namespace ã«ãã©ãçãã°çµã6526 # さもなければ Namespace 6527 # namespace の下に region がある場合 6528 end 6529 6530 # root namespace にたどり着けば終り 6875 6531 break if obj.get_name == "::" 6876 6532 … … 6883 6539 end 6884 6540 6885 #== Region# ãã¡ã¤ã³ãè¨å®ãã6541 #== Region#ドメインを設定する 6886 6542 def set_domain_type domain_type 6887 6543 if @region_type == :NODE then … … 6927 6583 end 6928 6584 6929 #== Region# domain ã®æ ¹ã£ãã¨ãªã region ãå¾ã6930 # Region ã®ã¤ã³ã¹ã¿ã³ã¹ãè¿ã6931 # domain æå®åãããã°ããã®ãªã¼ã¸ã§ã³ããã¡ã¤ã³ã«ã¼ãã§ãã6932 # ãªããã°ã親ãªã¼ã¸ã§ã³ã®ãã¡ã¤ã³ã«ã¼ãã¨ãã6585 #== Region# domain の根っことなる region を得る 6586 # Region のインスタンスを返す 6587 # domain 指定子があれば、そのリージョンがドメインルートである 6588 # なければ、親リージョンのドメインルートとする 6933 6589 def get_domain_root 6934 6590 @domain_root … … 6970 6626 end 6971 6627 6972 #=== Region# æ§æ解æä¸ã® region ãå¾ã 6973 # æ§æ解æä¸ Namespace (ãããã¯åã¯ã©ã¹ã® Region) ã®ä¸ä½ããã©ã£ã¦ Region ãè¦ã¤ãã 6974 # cell ã namespace ä¸ã«ãããã¨ãã§ããªããã°ãã«ã¼ããã¾ããå¿ 6975 è¦ã¯ãªã 6628 #=== Region# 構文解析中の region を得る 6629 # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける 6630 # cell が namespace 下におくことができなければ、ループをまわす必要はない 6976 6631 def self.get_current 6977 6632 # @@region_stack[@@region_stack_sp] … … 6986 6641 end 6987 6642 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) 6990 6645 def add_cell_port_through_plugin( cell_name, port_name, through_plugin_object ) 6991 6646 @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}" ] = through_plugin_object … … 7002 6657 end 7003 6658 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 で用いられる 7008 6662 def distance( to_region ) 7009 6663 7010 r1 = self # åºçºregion7011 r2 = to_region # ç®çregion6664 r1 = self # 出発 region 6665 r2 = to_region # 目的 region 7012 6666 dist = 0 7013 6667 7014 if ! r1.equal? r2 then # åä¸ region ãªãå¼åºãå¯è½7015 7016 # mikan namespace 対å¿6668 if ! r1.equal? r2 then # 同一 region なら呼出し可能 6669 6670 # mikan namespace 対応 7017 6671 f1 = r1.get_family_line 7018 6672 len1 = f1.length … … 7020 6674 len2 = f2.length 7021 6675 7022 # ä¸ä¸è´ã«ãªãã¨ããï¼å 7023 å¼ï¼ãæ¢ã 7024 i = 1 # i = 0 㯠:RootRegion ãªã®ã§å¿ 7025 ãä¸è´ 6676 # 不一致になるところ(兄弟)を探す 6677 i = 1 # i = 0 は :RootRegion なので必ず一致 7026 6678 while( i < len1 && i < len2 ) 7027 6679 if( f1[i] != f2[i] )then … … 7031 6683 end 7032 6684 7033 sibling_level = i # å 7034 å¼ã¨ãªãã¬ãã«ããããã¯ã©ã¡ããä¸æ¹ãçµãã£ãã¬ãã« 6685 sibling_level = i # 兄弟となるレベル、もしくはどちらか一方が終わったレベル 7035 6686 7036 6687 # p "sibling_level: #{i}" … … 7038 6689 # p "to: #{f2[i].get_name}" if f2[i] 7039 6690 7040 # å¼ã³å´ã«ã¤ãã¦å¼ã³å 7041 ã®ã¬ãã«ããå 7042 å¼ã¬ãã«ã¾ã§ï¼out_through ããã§ãã¯ããã³æ¿å 7043 ¥ï¼ 6691 # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入) 7044 6692 i = len1 -1 7045 6693 while i >= sibling_level … … 7064 6712 end 7065 6713 7066 # å 7067 å¼ã¬ãã«ã«ããã¦ï¼to_through ããã§ãã¯ããã³æ¿å 7068 ¥ï¼ 6714 # 兄弟レベルにおいて(to_through をチェックおよび挿入) 7069 6715 if f1[sibling_level] && f2[sibling_level] then 7070 6716 dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n" … … 7081 6727 found = 0 7082 6728 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 名が一致するか ? 7084 6730 found = 1 7085 6731 end … … 7092 6738 end 7093 6739 7094 # åãå´ã«ã¤ãã¦å 7095 å¼ã¬ãã«ããåãå´ã®ã¬ãã«ã¾ã§ï¼in_through ããã§ãã¯ããã³æ¿å 7096 ¥ï¼ 6740 # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入) 7097 6741 i = sibling_level 7098 6742 while i < len2 … … 7137 6781 class Import_C < Node 7138 6782 7139 # ãããã®ååæååã®ãªã¹ã6783 # ヘッダの名前文字列のリスト 7140 6784 @@header_list = {} 7141 6785 @@header_list2 = [] 7142 6786 @@define_list = {} 7143 6787 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 の第二引数文字列リテラルトークン 7147 6791 def initialize( header, define = nil ) 7148 6792 super() 7149 # ããããã¡ã¤ã«åæååããåå¾ã® "" ãåãé¤ã6793 # ヘッダファイル名文字列から前後の "" を取り除く 7150 6794 # header = header.to_s.gsub( /\A"(.*)"\z/, '\1' ) 7151 6795 header = CDLString.remove_dquote header.to_s 7152 6796 7153 6797 if define then 7154 # åå¾ã® "" ãåãé¤ã6798 # 前後の "" を取り除く 7155 6799 # def_opt = define.to_s.gsub( /\A"(.*)/, '\1' ) 7156 6800 # def_opt.sub!( /(.*)"\z/, '\1' ) 7157 6801 def_opt = CDLString.remove_dquote define.to_s 7158 6802 7159 # "," ã -D ã«ç½®ãæã6803 # "," を -D に置き換え 7160 6804 def_opt = def_opt.gsub( /,/, " -D " ) 7161 6805 7162 # å 7163 é ã« -D ãæ¿å 7164 ¥ # mikan ä¸é©å㪠define å 7165 ¥åããã£ãå ´åãCPP æã«ã¨ã©ã¼ 6806 # 先頭に -D を挿入 # mikan 不適切な define 入力があった場合、CPP 時にエラー 7166 6807 def_opt = def_opt.gsub( /^/, "-D " ) 7167 6808 7168 6809 end 7169 6810 7170 # ã³ãã³ãã©ã¤ã³æå®ãããDEFINE6811 # コマンドライン指定された DEFINE 7171 6812 $define.each{ |define| 7172 6813 if $IN_EXERB then … … 7189 6830 if found == false then 7190 6831 begin 7191 # ãã¡ã¤ã«ã® stat ãåã£ã¦ã¿ã(ãªããã°ä¾å¤çºç)6832 # ファイルの stat を取ってみる(なければ例外発生) 7192 6833 File.stat( "#{path}/#{header}" ) 7193 6834 7194 # cdl ãè¦ã¤ãã£ããã¡ã¤ã«ãã¹ã«åè¨å®6835 # cdl を見つかったファイルパスに再設定 7195 6836 header_path = "#{path}/#{header}" 7196 6837 found = true … … 7207 6848 end 7208 6849 7209 # èªè¾¼ã¿æ¸ã¿ï¼6850 # 読込み済み? 7210 6851 if( @@header_list[ header ] ) then 7211 # 第äºå¼æ° define ã以åã¨ç°ãªã6852 # 第二引数 define が以前と異なる 7212 6853 if @@define_list[ header ].to_s != define.to_s then 7213 6854 cdl_error( "S1143 import_C: arg2: mismatch with previous one" ) 7214 6855 end 7215 # ãããã«ããèªã¿è¾¼ã¾ãªã6856 # いずれにせよ読み込まない 7216 6857 return 7217 6858 end 7218 6859 7219 # ãããã®ãªã¹ããè¨é²6860 # ヘッダのリストを記録 7220 6861 @@header_list[ header ] = header_path 7221 6862 @@header_list2 << header … … 7241 6882 end 7242 6883 7243 # CPP åºåç¨ tmp ãã¡ã¤ã«å6884 # CPP 出力用 tmp ファイル名 7244 6885 tmp_header = header.gsub( /\//, "_" ) 7245 6886 tmp_header = "#{$gen}/tmp_#{tmp_header}" 7246 6887 7247 # CPP ã³ãã³ãã©ã¤ã³ãä½æ6888 # CPP コマンドラインを作成 7248 6889 cmd = "#{$cpp} #{def_opt} #{include_opt} #{tmp_C}" 7249 6890 … … 7253 6894 end 7254 6895 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 # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意 7259 6900 cpp = IO.popen( cmd, "r:ASCII-8BIT" ) 7260 6901 begin … … 7269 6910 print_exception( evar ) 7270 6911 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 は保証されている ? 7272 6913 cpp.close 7273 6914 end … … 7277 6918 end 7278 6919 7279 # C è¨èªã®ãã¼ãµã¤ã³ã¹ã¿ã³ã¹ãçæ6920 # C 言語のパーサインスタンスを生成 7280 6921 c_parser = C_parser.new 7281 6922 7282 # tmp_header ããã¼ã¹6923 # tmp_header をパース 7283 6924 c_parser.parse( [tmp_header] ) 7284 6925 7285 # çµæåããã¼ãµã¹ã¿ãã¯ãæ»ã6926 # 終期化 パーサスタックを戻す 7286 6927 c_parser.finalize 7287 6928 … … 7337 6978 7338 6979 class Import < Node 7339 # @b_reuse::bool: åå©ç¨ï¼ã»ã«ã¿ã¤ãã® template çæä¸è¦7340 # @b_reuse_real::bool: å®éã«åå©ç¨7341 # @cdl:: string: import ããCDL7342 # @cdl_path:: string: CDL ã®ãã¹7343 # @b_imported:: bool: import ããã(ã³ãã³ãã©ã¤ã³æå®ããã¦ããªã)7344 7345 # ãããã®ååæååã®ãªã¹ã æ·»åï¼expand ãããã¹ãå¤ï¼Import6980 # @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 7346 6987 @@import_list = {} 7347 6988 … … 7364 7005 end 7365 7006 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 を生成しない 7369 7010 def initialize( cdl, b_reuse = false, b_imported = true ) 7370 7011 Import.push self … … 7372 7013 super() 7373 7014 @@current_import = self 7374 # ããããã¡ã¤ã«åæååããåå¾ã® "", <> ãåãé¤ãn7015 # ヘッダファイル名文字列から前後の "", <> を取り除くn 7375 7016 @cdl = cdl.to_s.gsub( /\A["<](.*)[">]\z/, '\1' ) 7376 7017 7377 # ãµã¼ããã¹ããæ¢ã7018 # サーチパスから探す 7378 7019 found = false 7379 7020 @cdl_path = "" … … 7383 7024 7384 7025 if Generator.get_plugin then 7385 # plugin ãã import ããã¦ããå ´å gen ããµã¼ããã¹ã®å 7386 é ã«å ãã 7026 # plugin から import されている場合 gen をサーチパスの先頭に加える 7387 7027 search_path = [ $gen ] + $import_path 7388 7028 else … … 7399 7039 end 7400 7040 7401 # ãã¡ã¤ã«ã® stat ãåã£ã¦ã¿ã(ãªããã°ä¾å¤çºç)7041 # ファイルの stat を取ってみる(なければ例外発生) 7402 7042 File.stat( cdl_path ) 7403 7043 7404 # cdl ãè¦ã¤ãã£ããã¡ã¤ã«ãã¹ã«åè¨å®7044 # cdl を見つかったファイルパスに再設定 7405 7045 @cdl_path = cdl_path 7406 7046 found = true … … 7419 7059 end 7420 7060 7421 # èªè¾¼ã¿æ¸ã¿ãªããèªè¾¼ã¾ãªã7061 # 読込み済みなら、読込まない 7422 7062 prev = @@import_list[ File.expand_path( @cdl_path ) ] 7423 7063 if( prev ) then … … 7428 7068 end 7429 7069 7430 # import ãªã¹ããè¨é²7070 # import リストを記録 7431 7071 @@import_list[ File.expand_path( @cdl_path ) ] = self 7432 7072 7433 # plugin ãã import ããã¦ããå ´å7073 # plugin から import されている場合 7434 7074 plugin = Generator.get_plugin 7435 7075 7436 # ãã¼ãµã¤ã³ã¹ã¿ã³ã¹ãçæ(å¥ãã¼ãµã§èªã¿è¾¼ã)7076 # パーサインスタンスを生成(別パーサで読み込む) 7437 7077 parser = Generator.new 7438 7078 7439 # plugin ãã import ããã¦ããå ´åã® plugin è¨å®7079 # plugin から import されている場合の plugin 設定 7440 7080 parser.set_plugin plugin 7441 7081 7442 # reuse ãã©ã°ãè¨å®7082 # reuse フラグを設定 7443 7083 parser.set_reuse @b_reuse_real 7444 7084 7445 # cdl ããã¼ã¹7085 # cdl をパース 7446 7086 parser.parse( [@cdl_path] ) 7447 7087 7448 # çµæåããã¼ãµã¹ã¿ãã¯ãæ»ã7088 # 終期化 パーサスタックを戻す 7449 7089 parser.finalize 7450 7090 Import.pop … … 7471 7111 end 7472 7112 7473 #=== cdl ã®ååãè¿ã7474 # å¼æ°ã§æå®ããã¦ãã cdl åãä¸é¨ãã¹ãå«ãå¯è½æ§ããã7113 #=== cdl の名前を返す 7114 # 引数で指定されている cdl 名。一部パスを含む可能性がある 7475 7115 def get_cdl_name 7476 7116 @cdl … … 7478 7118 end 7479 7119 7480 #== generate: signature ãã©ã°ã¤ã³ã®ãã¼ãã¨å®è¡7120 #== generate: signature プラグインのロードと実行 7481 7121 class Generate < Node 7482 7122 #@plugin_name:: Symbol 7483 7123 #@signature_nsp:: NamespacePath 7484 #@option:: String '"', '"' ã§å²ã¾ãã¦ãã7124 #@option:: String '"', '"' で囲まれている 7485 7125 7486 7126 include PluginModule … … 7490 7130 @plugin_name = plugin_name 7491 7131 @signature_nsp = signature_nsp 7492 option = option.to_s # option ã¯Token7132 option = option.to_s # option は Token 7493 7133 @option = option 7494 7134 … … 7511 7151 7512 7152 begin 7513 eval( eval_str ) # plugin ãçæ7153 eval( eval_str ) # plugin を生成 7514 7154 plugin_object.set_locale @locale 7515 7155 rescue Exception => evar … … 7523 7163 end 7524 7164 7525 #== åå空éãã¹7165 #== 名前空間パス 7526 7166 class NamespacePath < Node 7527 7167 #@b_absolute::Bool 7528 7168 #@path::[ Symbol,... ] 7529 #@namespace::Namespace: @b_absolute == false ã®ã¨ããåºç¹ã¨ãªãnamespace7169 #@namespace::Namespace: @b_absolute == false のとき、基点となる namespace 7530 7170 7531 7171 #=== 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 かつ、構文解釈段階以外で呼び出す場合は、必ず指定すること 7536 7175 def initialize( ident, b_absolute, namespace = nil ) 7537 7176 super() … … 7559 7198 end 7560 7199 7561 #=== NamespacePath# append ãã7200 #=== NamespacePath# append する 7562 7201 #RETURN self 7563 # ãã®ã¡ã½ããã¯ãå 7564 ã® NamespacePath ãªãã¸ã§ã¯ããå¤å½¢ãã¦è¿ã 7202 # このメソッドは、元の NamespacePath オブジェクトを変形して返す 7565 7203 def append!( ident ) 7566 7204 @path << ident 7567 7205 return self 7568 7206 end 7569 #=== NamespacePath# append ãã 7570 # ãã®ã¡ã½ããã¯ãå 7571 ã® NamespacePath ãªãã¸ã§ã¯ããå¤å½¢ããªã 7572 #RETURN:: è¤è£½ãã NamespacePath 7207 #=== NamespacePath# append する 7208 # このメソッドは、元の NamespacePath オブジェクトを変形しない 7209 #RETURN:: 複製した NamespacePath 7573 7210 def append( ident ) 7574 7211 cl = self.clone … … 7586 7223 end 7587 7224 7588 #=== NamespacePath# ã¯ãã¼ã³ãä½æãã¦ååãå¤æ´ãã7225 #=== NamespacePath#クローンを作成して名前を変更する 7589 7226 def change_name name 7590 7227 cl = self.clone … … 7595 7232 alias :change_name_clone :change_name 7596 7233 7597 #=== NamespacePath#ååãå¤æ´ãã 7598 # ãã®ã¤ã³ã¹ã¿ã³ã¹ãåç 7599 §ãããã¹ã¦ã«å½±é¿ãä¸ãããã¨ã«æ³¨æ 7234 #=== NamespacePath#名前を変更する 7235 # このインスタンスを参照するすべてに影響を与えることに注意 7600 7236 def change_name_no_clone name 7601 7237 @path[ @path.length - 1 ] = name … … 7603 7239 end 7604 7240 7605 #=== NamespacePath:: path æååãå¾ã7606 # CDL ç¨ã® path æååãçæ7241 #=== NamespacePath:: path 文字列を得る 7242 # CDL 用の path 文字列を生成 7607 7243 def to_s 7608 7244 get_path_str … … 7633 7269 end 7634 7270 7635 #=== NamespacePath:: ãã¹ã®é 7636 åãè¿ã 7637 # is_absolute? true ã®å ´åãã«ã¼ãããã®ãã¹ 7638 # false ã®å ´åãbase_namespace ããã®ç¸å¯¾ 7639 # ã«ã¼ã namespace ã®å ´åãé·ãï¼ã®é 7640 åãè¿ã 7271 #=== NamespacePath:: パスの配列を返す 7272 # is_absolute? true の場合、ルートからのパス 7273 # false の場合、base_namespace からの相対 7274 # ルート namespace の場合、長さ0の配列を返す 7641 7275 # 7642 7276 def get_path … … 7644 7278 end 7645 7279 7646 #=== NamespacePath#ãã«ãã¹ã®é 7647 åãè¿ã 7648 # è¿ãããé 7649 åãæ¸ãæãã¦ã¯ãªããªã 7280 #=== NamespacePath#フルパスの配列を返す 7281 # 返された配列を書き換えてはならない 7650 7282 def get_full_path 7651 7283 if @b_absolute then … … 7656 7288 end 7657 7289 7658 #=== NamespacePath:: ç¸å¯¾ãã¹ã®ãã¼ã¹ã¨ãªãnamespace7659 # is_absolute? == false ã®æã®ã¿æå¹ãªå¤ãè¿ã (true ãªãnil)7290 #=== NamespacePath:: 相対パスのベースとなる namespace 7291 # is_absolute? == false の時のみ有効な値を返す (true なら nil) 7660 7292 def get_base_namespace 7661 7293 @namespace 7662 7294 end 7663 7295 7664 #=== NamespacePath:: C è¨èªã°ãã¼ãã«åãå¾ã7296 #=== NamespacePath:: C 言語グローバル名を得る 7665 7297 def get_global_name 7666 7298 if @b_absolute then … … 7680 7312 end 7681 7313 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 : "::" で始まっていない場合でも絶対パスに扱う 7685 7317 # 7686 # NamespacePath ã¯é常æ§æ解æããã¦ä½æããã7687 # ãã®ã¡ã½ããã¯ããªãã·ã§ã³ãªã©ã§æå®ãããæååãå解ã㦠NamespacePath ãçæããã®ã«ç¨ãã7688 # ãã§ãã¯ã¯ããããä¸é©åãªãã¹æå®ã¯ãä¸é©å㪠NamespacePath ãçæããã7318 # NamespacePath は通常構文解析されて作成される 7319 # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる 7320 # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される 7689 7321 def self.analyze( path_str, b_force_absolute = false ) 7690 7322 … … 7725 7357 end 7726 7358 7727 # 以ä¸åä½ãã¹ãã³ã¼ã7359 # 以下単体テストコード 7728 7360 if $unit_test then 7729 7361 root_namespace = Namespace.new("::") -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.