- 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/optimize.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r270 r321 6 6 # Copyright (C) 2008-2014 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 : optimize.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 … … 58 43 Other processes are setting ID for each cell and setting domain information 59 44 60 ãã®ãã¡ã¤ã«ã«ã¯ãæå³è§£æããã³ã¼ãçæã®éã§è¡ãã¹ãå¦çãå«ã¾ããï¼ 61 æé©åããã®ä¸ã¤ã§ããï¼ 62 ãã®ä»ã«ãã»ã«æ¯ã® ID ä»ãããã¡ã¤ã³ãããè¡ãï¼ 63 ã³ã¼ãçæ対象ã¨ãªãã»ã«ã対象ã«å¦çãè¡ããã®ãå«ã¾ããï¼ 45 このファイルには、意味解析からコード生成の間で行うべき処理が含まれる. 46 最適化もその一つである. 47 その他に、セル毎の ID 付け、ドメインわけを行う. 48 コード生成対象となるセルを対象に処理を行うものが含まれる. 64 49 =end 65 50 66 51 class Namespace 67 52 68 #=== åã»ã«ã« ID ï¼æ´æ°å¤ï¼ãå²ä»ãã53 #=== 各セルに ID (整数値)を割付ける 69 54 def set_cell_id_and_domain 70 # celltype ã®åã»ã«ã« ID ãå²ä»ãã55 # celltype の各セルに ID を割付ける 71 56 @celltype_list.each { |t| 72 57 t.set_cell_id_and_domain 73 58 } 74 59 75 # ãµããã¼ã ã¹ãã¼ã¹ã®åã»ã«ã« ID ãå²ä»ãã60 # サブネームスペースの各セルに ID を割付ける 76 61 @namespace_list.each { |n| 77 62 n.set_cell_id_and_domain … … 80 65 81 66 def optimize 82 # celltype ã®æé©å67 # celltype の最適化 83 68 @celltype_list.each { |t| 84 69 t.optimize 85 70 } 86 71 87 # ãµããã¼ã ã¹ãã¼ã¹ã®æé©å72 # サブネームスペースの最適化 88 73 @namespace_list.each { |n| 89 74 n.optimize … … 92 77 93 78 def reset_optimize 94 # celltype ã®æé©å79 # celltype の最適化 95 80 @celltype_list.each { |t| 96 81 t.reset_optimize 97 82 } 98 83 99 # ãµããã¼ã ã¹ãã¼ã¹ã®æé©å84 # サブネームスペースの最適化 100 85 @namespace_list.each { |n| 101 86 n.reset_optimize … … 106 91 class Celltype 107 92 108 ID_BASE = 1 # reset_optimize ã§ãªã»ãããã93 ID_BASE = 1 # reset_optimize でリセットする 109 94 @@ID_BASE = ID_BASE 110 95 … … 114 99 end 115 100 116 #=== åã»ã«ã« ID ï¼æ´æ°å¤ï¼ãå²ä»ãã101 #=== 各セルに ID (整数値)を割付ける 117 102 def set_cell_id 118 103 … … 122 107 123 108 if $unique_id then 124 @id_base = @@ID_BASE # id ãã·ã¹ãã å 125 ¨ä½ã§é£çªã«ãã 109 @id_base = @@ID_BASE # id をシステム全体で連番にする 126 110 else 127 @id_base = 1 # base ã常㫠1 ããå§ãã111 @id_base = 1 # base を常に 1 から始める 128 112 end 129 113 … … 131 115 no_id_specified_cells = [] 132 116 133 # ãããã¿ã¤ããé¤ããæ°ãæ±ãã117 # プロトタイプを除いた数を求める 134 118 @cell_list.each{ |c| 135 119 if c.is_generate? then … … 148 132 } 149 133 150 @ordered_cell_list = [] # id = 1 ãæ·»æ° 0 ã«æ ¼ç´ããã151 # ID æå®ããã¦ããã»ã«ã« id çªå·ãä¸ãã134 @ordered_cell_list = [] # id = 1 が添数 0 に格納される 135 # ID 指定されているセルに id 番号を与える 152 136 id_specified_cells.each{ |c| 153 137 id = c.get_specified_id … … 169 153 end 170 154 @ordered_cell_list[ id - 1 ] = c 171 # éãçªå·ã¨ããå ´åã®ãã @id_base ãå ãã155 # 通し番号とする場合のため @id_base を加える 172 156 c.set_id( @id_base - 1 + id ) 173 157 if $verbose then … … 176 160 } 177 161 178 # ID æå®ããã¦ããªãã»ã«ã« id çªå·ãä¸ãã162 # ID 指定されていないセルに id 番号を与える 179 163 i = 0 180 164 no_id_specified_cells.each{ |c| … … 226 210 227 211 @domain_roots.each{ |dn, regions| 228 # domain_type ã¯ä¸ã¤ã®ãã¼ãã«ä¸ã¤ãããªãã®ã§ãä¸ã¤ã®è¦ç´ ãç¡æ¡ä»¶ã§åãåºã212 # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す 229 213 if regions.length > 1 then 230 214 cdl_info( "celltype:#{@name} has cells in multi domain.\n" ) … … 239 223 def optimize 240 224 241 # port ã®åç 242 §ããã»ã«ã¿ã¤ãã®æ°ãã»ã«ã®æ°ãæ±ãã 225 # port の参照するセルタイプの数、セルの数を求める 243 226 if $verbose then 244 227 print "=== optimizing celltype #{get_namespace_path.to_s} ===\n" … … 248 231 next if port.get_port_type != :CALL 249 232 if port.is_omit? then 250 # å¼ã³å£æé©åå®æ½233 # 呼び口最適化実施 251 234 @b_cp_optimized = true 252 @n_call_port_omitted_in_CB += 1 # CB ã§çç¥ããå¼ã³å£253 port.set_skelton_useless # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å254 port.set_VMT_useless # VMT ä¸è¦æé©å (ç´æ¥åãå£é¢æ°ãå¼åºã)235 @n_call_port_omitted_in_CB += 1 # CB で省略する呼び口 236 port.set_skelton_useless # スケルトン関数不要最適化 237 port.set_VMT_useless # VMT 不要最適化 (直接受け口関数を呼出す) 255 238 if $verbose then 256 239 print "optimized by omit: port: #{port.get_name} : o\n" … … 263 246 end 264 247 265 port_cells = [] # å¼ã³å 266 ã»ã« 267 port_ports = [] # å¼ã³å 268 ã®ãã¼ã 269 270 # ã»ã«ã®åç 271 §ããã»ã«ãéããï¼ãã¼ããä¸ç·ã«éããï¼ 248 port_cells = [] # 呼び先セル 249 port_ports = [] # 呼び先のポート 250 251 # セルの参照するセルを集める(ポートも一緒に集める) 272 252 @cell_list.each{ |cell| 273 253 … … 281 261 if j then 282 262 if j.get_array_member2 then 283 # å¼ã³å£é 284 åã®å ´åãå 285 ¨é¨ã®çµåå 286 ãéãã 263 # 呼び口配列の場合、全部の結合先を集める 287 264 j.get_array_member2.each { |j2| 288 265 if j2 then 289 266 port_cells << j2.get_rhs_cell 290 port_ports << j2.get_rhs_port # å³è¾ºã®ãã¼ã267 port_ports << j2.get_rhs_port # 右辺のポート 291 268 else 292 # optional ã§ãããæ·»æ°ã®ã¿åæåããã¦ããªãï¼ãã¹ã¦åæåãããªãå ´åã¯ãä¸ï¼269 # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下) 293 270 port_cells << nil 294 271 port_ports << nil … … 296 273 } 297 274 else 298 # å 299 ¨ã¦ã®çµåå 300 ãéãã 275 # 全ての結合先を集める 301 276 port_cells << j.get_rhs_cell 302 port_ports << j.get_rhs_port # å³è¾ºã®ãã¼ã277 port_ports << j.get_rhs_port # 右辺のポート 303 278 end 304 279 else 305 # optional ã§åæåããã¦ããªãï¼nil ãè¦ç´ ã«å ãã¦ããï¼280 # optional で初期化されていない(nil を要素に加えておく) 306 281 port_cells << nil 307 port_ports << nil # å³è¾ºã®ãã¼ã282 port_ports << nil # 右辺のポート 308 283 end 309 284 } 310 285 311 # éè¤è¦ç´ ãåãé¤ã286 # 重複要素を取り除く 312 287 port_cells.uniq! 313 288 port_ports.uniq! 314 289 315 # å¼ã³å£ã®å¼ã³å 316 ãä¸ã¤ã®ãã¼ãã ããï¼ 290 # 呼び口の呼び先が一つのポートだけか? 317 291 if port_ports.length == 1 then 318 292 319 # å¼ã³å£é 320 åãå¯å¤é·ã®å ´åãæé©åããªã 321 # mikan å¼ã³å£é 322 åè¦ç´ æ°ãã¯ãä¸å 323 ·åæ«å®å¯¾ç 324 # ããæã¾ããä¿®æ£ã¯ãåãå£ã¸ã®ãã¤ã³ã¿ã¯çç¥ããããé 325 ååæ°ã¯åºåãã(#_CP_#, #_TCP_#) 326 # ããã«é 327 ååæ°ãå®æ°åã§ããã®ã§ããã°ãå®æ°ãã¯ããåºå (#_NCPA_#) 293 # 呼び口配列が可変長の場合、最適化しない 294 # mikan 呼び口配列要素数マクロ不具合暫定対策 295 # より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#) 296 # さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#) 328 297 next if port.get_array_size == "[]" 329 298 330 # å¼ã³å£æé©åå®æ½299 # 呼び口最適化実施 331 300 @b_cp_optimized = true 332 301 333 # å¼ã³å 334 ãä¸ã¤ã®ã»ã«ã ããï¼ 302 # 呼び先が一つのセルだけか? 335 303 if port_cells.length == 1 then 336 304 337 # å¼ã³å£ã¯ optional ã§åæåããã¦ããªããã¾ãã¯åãå£ã¯é 338 åã§ã¯ãªããï¼ 305 # 呼び口は optional で初期化されていない、または受け口は配列ではないか? 339 306 if port_ports[0] == nil || port_ports[0].get_array_size == nil then 340 307 341 @n_call_port_omitted_in_CB += 1 # CB ã§çç¥ããå¼ã³å£342 port.set_cell_unique # ã»ã«ä¸ã¤ã ãæé©å343 port.set_skelton_useless # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å344 port.set_VMT_useless # VMT ä¸è¦æé©å (ç´æ¥åãå£é¢æ°ãå¼åºã)308 @n_call_port_omitted_in_CB += 1 # CB で省略する呼び口 309 port.set_cell_unique # セル一つだけ最適化 310 port.set_skelton_useless # スケルトン関数不要最適化 311 port.set_VMT_useless # VMT 不要最適化 (直接受け口関数を呼出す) 345 312 346 313 if $verbose then … … 348 315 end 349 316 else 350 port.set_VMT_useless # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ°ãå¼åºã)317 port.set_VMT_useless # VMT 不要最適化 (スケルトン関数を呼出す) 351 318 352 319 if $verbose then … … 355 322 end 356 323 357 else # å¼ã³å 358 ãè¤æ°ã®ã»ã«ï¼åä¸ã®ãã¼ãï¼ 359 360 # å¼ã³å£ã¯ optional ã§åæåããã¦ããªããã¾ãã¯åãå£ã¯é 361 åã§ã¯ãªããï¼ 324 else # 呼び先が複数のセル(単一のポート) 325 326 # 呼び口は optional で初期化されていない、または受け口は配列ではないか? 362 327 if port_ports[0] == nil || port_ports[0].get_array_size == nil then 363 328 if ! @singleton then 364 port.set_skelton_useless # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å365 port.set_VMT_useless # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ° or åãå£é¢æ°ãå¼åºã)329 port.set_skelton_useless # スケルトン関数不要最適化 330 port.set_VMT_useless # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す) 366 331 367 332 if $verbose then … … 369 334 end 370 335 else 371 port.set_VMT_useless # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ° or åãå£é¢æ°ãå¼åºã)336 port.set_VMT_useless # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す) 372 337 373 338 if $verbose then … … 379 344 380 345 port.set_only_callee( port_ports[0], port_cells[0] ) 381 # set_cell_unique ã§ãªãå ´å cell ã¯æå³ããªã346 # set_cell_unique でない場合 cell は意味がない 382 347 383 348 end … … 387 352 } 388 353 389 # åãå£æé©åã®è¨å®354 # 受け口最適化の設定 390 355 @port.each{ |port| 391 356 next if port.get_port_type != :CALL 392 357 393 # å¼ã³å£å´ã®æé©åç¶æ 394 358 # 呼び口側の最適化状態 395 359 b_VMT_useless = port.is_VMT_useless? 396 360 b_skelton_useless = port.is_skelton_useless? 397 361 398 # ã»ã«ã®åç 399 §ããã»ã«ãéããï¼ãã¼ããä¸ç·ã«éããï¼ 362 # セルの参照するセルを集める(ポートも一緒に集める) 400 363 @cell_list.each{ |cell| 401 364 … … 407 370 j = jl.get_item( port.get_name ) 408 371 409 if j then # optional ã§çµåããã¦ããªãå ´ånil372 if j then # optional で結合されていない場合 nil 410 373 if j.get_array_member2 then 411 # å¼ã³å£é 412 å 374 # 呼び口配列 413 375 j.get_array_member2.each { |j2| 414 376 if j2 then 415 port2 = j2.get_rhs_port # å³è¾ºã®ãã¼ã416 # åãå£å´ã®æé©åå¯è½æ§ãè¨å®377 port2 = j2.get_rhs_port # 右辺のポート 378 # 受け口側の最適化可能性を設定 417 379 port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless ) 418 380 #else 419 # optional ã§å¼ã³å£é 420 åè¦ç´ ãåæåããã¦ããªã 381 # optional で呼び口配列要素が初期化されていない 421 382 end 422 383 } 423 384 else 424 port2 = j.get_rhs_port # å³è¾ºã®ãã¼ã425 # åãå£å´ã®æé©åå¯è½æ§ãè¨å®385 port2 = j.get_rhs_port # 右辺のポート 386 # 受け口側の最適化可能性を設定 426 387 port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless ) 427 388 end … … 431 392 end 432 393 433 #Celltype# ãªã»ãããã394 #Celltype# リセットする 434 395 def reset_optimize 435 @@ID_BASE = ID_BASE # æ¬å½ã¯ä¸åã ãã§ãã436 @id_base = 1 # set_cell_id ã§ãªã»ãããããã®ã§ä¸è¦437 438 @b_cp_optimized = false # å¼ã³å£æé©å439 @n_call_port_omitted_in_CB = 0 # å¼ã³å£æé©åã«ããä¸çæã¨ãªã£ããã¼ãã®æ°440 @n_cell_gen = 0 # çæã»ã«åæ°396 @@ID_BASE = ID_BASE # 本当は一回だけでよい 397 @id_base = 1 # set_cell_id でリセットされるので不要 398 399 @b_cp_optimized = false # 呼び口最適化 400 @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数 401 @n_cell_gen = 0 # 生成セル個数 441 402 @port.each{ |p| 442 403 p.reset_optimize … … 446 407 end 447 408 448 #Celltype# ããã㯠include ããã¦ããã449 #hname::Symbol : ãããå450 #RETURN:: bool_t: false ã¤ã³ã¯ã«ã¼ãããã¦ããªããtrue ã¤ã³ã¯ã«ã¼ãããã¦ãã451 # #_ISH_#, #_ICT_# ã§ããããåãè¾¼ã¾ãã¦ããããã§ãã¯ãã452 # false ãè¿ã£ãå ´åãhname ã¯ç»é²ããã¦ã次åã®å¼ã³åºãã§ã¯ true ãè¿ã409 #Celltype# ヘッダは include されているか 410 #hname::Symbol : ヘッダ名 411 #RETURN:: bool_t: false インクルードされていない、true インクルードされている 412 # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする 413 # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る 453 414 def header_included?( hname ) 454 415 if @included_header[ hname ] == nil then -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.