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

ビルドが通るよう更新

File:
1 edited

Legend:

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

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2018 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    5237#   $Id$
     
    5843Other processes are setting ID for each cell and setting domain information
    5944
    60 ã“のファイルには、意味解析からコード生成の間で行うべき処理が含まれる.
    61 æœ€é©åŒ–もその一つである.
    62 ãã®ä»–に、セル毎の ID 付け、ドメインわけを行う.
    63 ã‚³ãƒ¼ãƒ‰ç”Ÿæˆå¯¾è±¡ã¨ãªã‚‹ã‚»ãƒ«ã‚’対象に処理を行うものが含まれる.
     45このファイルには、意味解析からコード生成の間で行うべき処理が含まれる.
     46最適化もその一つである.
     47その他に、セル毎の ID 付け、ドメインわけを行う.
     48コード生成対象となるセルを対象に処理を行うものが含まれる.
    6449=end
    6550
    6651class Namespace
    6752
    68   #===  各セルに ID (整数値)を割付ける
     53  #===  各セルに ID (整数値)を割付ける
    6954  def set_cell_id_and_domain
    70     # celltype の各セルに ID を割付ける
     55    # celltype の各セルに ID を割付ける
    7156    @celltype_list.each { |t|
    7257      t.set_cell_id_and_domain
    7358    }
    7459
    75     # サブネームスペースの各セルに ID を割付ける
     60    # サブネームスペースの各セルに ID を割付ける
    7661    @namespace_list.each { |n|
    7762      n.set_cell_id_and_domain
     
    8065
    8166  def optimize
    82     # celltype の最適化
     67    # celltype の最適化
    8368    @celltype_list.each { |t|
    8469      t.optimize
    8570    }
    8671
    87     # サブネームスペースの最適化
     72    # サブネームスペースの最適化
    8873    @namespace_list.each { |n|
    8974      n.optimize
     
    9277
    9378  def reset_optimize
    94     # celltype の最適化
     79    # celltype の最適化
    9580    @celltype_list.each { |t|
    9681      t.reset_optimize
    9782    }
    9883
    99     # サブネームスペースの最適化
     84    # サブネームスペースの最適化
    10085    @namespace_list.each { |n|
    10186      n.reset_optimize
     
    10691class Celltype
    10792
    108   ID_BASE = 1               # reset_optimize でリセットする
     93  ID_BASE = 1               # reset_optimize でリセットする
    10994  @@ID_BASE = ID_BASE
    11095
     
    11499  end
    115100
    116   #=== 各セルに ID (整数値)を割付ける
     101  #=== 各セルに ID (整数値)を割付ける
    117102  def set_cell_id
    118103
     
    122107
    123108    if $unique_id then
    124       @id_base = @@ID_BASE   # id をシステムå
    125 ¨ä½“で連番にする
     109      @id_base = @@ID_BASE   # id をシステム全体で連番にする
    126110    else
    127       @id_base = 1           # base を常に 1 から始める
     111      @id_base = 1           # base を常に 1 から始める
    128112    end
    129113
     
    131115    no_id_specified_cells = []
    132116
    133     # プロトタイプを除いた数を求める
     117    # プロトタイプを除いた数を求める
    134118    @cell_list.each{ |c|
    135119      if c.is_generate? then
     
    148132    }
    149133
    150     @ordered_cell_list = []   # id = 1 が添数 0 に格納される
    151     # ID 指定されているセルに id 番号を与える
     134    @ordered_cell_list = []   # id = 1 が添数 0 に格納される
     135    # ID 指定されているセルに id 番号を与える
    152136    id_specified_cells.each{ |c|
    153137      id = c.get_specified_id
     
    169153      end
    170154      @ordered_cell_list[ id - 1 ] = c
    171       # 通し番号とする場合のため @id_base を加える
     155      # 通し番号とする場合のため @id_base を加える
    172156      c.set_id( @id_base - 1 + id )
    173157      if $verbose then
     
    176160    }
    177161
    178     # ID 指定されていないセルに id 番号を与える
     162    # ID 指定されていないセルに id 番号を与える
    179163    i = 0
    180164    no_id_specified_cells.each{ |c|
     
    243227
    244228    @domain_roots.each{ |dn, regions|
    245       # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
     229      # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
    246230      if regions.length > 1 then
    247231        if $verbose then
     
    259243  def optimize
    260244
    261     # port の参ç
    262 §ã™ã‚‹ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の数、セルの数を求める
     245    # port の参照するセルタイプの数、セルの数を求める
    263246    if $verbose then
    264247      print "=== optimizing celltype #{get_namespace_path.to_s} ===\n"
     
    271254  end
    272255
    273   #=== Celltype#呼び口最適化
     256  #=== Celltype#呼び口最適化
    274257  def optimize_call
    275258    @port.each{ |port|
    276259      next if port.get_port_type != :CALL
    277260      if port.is_omit? then
    278         # 呼び口最適化実施
     261        # 呼び口最適化実施
    279262        @b_cp_optimized = true
    280         @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    281         port.set_skelton_useless                      # スケルトン関数不要最適化
    282         port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     263        @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     264        port.set_skelton_useless                      # スケルトン関数不要最適化
     265        port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    283266        if $verbose then
    284267          print "optimized by omit: port: #{port.get_name} : o\n"
     
    301284      end
    302285
    303       port_cells = []    # 呼びå
    304 ˆã‚»ãƒ«
    305       port_ports = []    # 呼びå
    306 ˆã®ãƒãƒ¼ãƒˆ
    307 
    308       # セルの参ç
    309 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     286      port_cells = []    # 呼び先セル
     287      port_ports = []    # 呼び先のポート
     288
     289      # セルの参照するセルを集める(ポートも一緒に集める)
    310290      @cell_list.each{ |cell|
    311291
     
    319299        if j then
    320300          if j.get_array_member2 then
    321             # 呼び口é
    322 åˆ—の場合、å
    323 ¨éƒ¨ã®çµåˆå
    324 ˆã‚’集める
     301            # 呼び口配列の場合、全部の結合先を集める
    325302            j.get_array_member2.each { |j2|
    326303              if j2 then
    327304                port_cells << j2.get_rhs_cell
    328                 port_ports << j2.get_rhs_port   # 右辺のポート
     305                port_ports << j2.get_rhs_port   # 右辺のポート
    329306              else
    330                 # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
     307                # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
    331308                port_cells << nil
    332309                port_ports << nil
     
    334311            }
    335312          else
    336             # å
    337 ¨ã¦ã®çµåˆå
    338 ˆã‚’集める
     313            # 全ての結合先を集める
    339314            port_cells << j.get_rhs_cell
    340             port_ports << j.get_rhs_port   # 右辺のポート
     315            port_ports << j.get_rhs_port   # 右辺のポート
    341316          end
    342317        else
    343           # optional で初期化されていない(nil を要素に加えておく)
     318          # optional で初期化されていない(nil を要素に加えておく)
    344319          port_cells << nil
    345           port_ports << nil   # 右辺のポート
     320          port_ports << nil   # 右辺のポート
    346321        end
    347322      }
    348323
    349       # 重複要素を取り除く
     324      # 重複要素を取り除く
    350325      port_cells.uniq!
    351326      port_ports.uniq!
    352327
    353       # 呼び口の呼びå
    354 ˆãŒä¸€ã¤ã®ãƒãƒ¼ãƒˆã ã‘か?
     328      # 呼び口の呼び先が一つのポートだけか?
    355329      if port_ports.length == 1 then
    356330
    357         # 呼び口é
    358 åˆ—が可変長の場合、最適化しない
    359              # mikan 呼び口é
    360 åˆ—要素数マクロ不å
    361 ·åˆæš«å®šå¯¾ç­–
    362              # より望ましい修正は、受け口へのポインタは省略するが、é
    363 åˆ—個数は出力する(#_CP_#, #_TCP_#)
    364              # さらにé
    365 åˆ—個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
     331        # 呼び口配列が可変長の場合、最適化しない
     332             # mikan 呼び口配列要素数マクロ不具合暫定対策
     333             # より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#)
     334             # さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
    366335        next if port.get_array_size == "[]"
    367336
    368         # 呼び口最適化実施
     337        # 呼び口最適化実施
    369338        @b_cp_optimized = true
    370339
    371         # 呼びå
    372 ˆãŒä¸€ã¤ã®ã‚»ãƒ«ã ã‘か?
     340        # 呼び先が一つのセルだけか?
    373341        if port_cells.length == 1 then
    374342
    375           # 呼び口は optional で初期化されていない、または受け口はé
    376 åˆ—ではないか?
     343          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    377344          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    378345
    379             @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    380             port.set_cell_unique                          # セル一つだけ最適化
    381             port.set_skelton_useless                      # スケルトン関数不要最適化
    382             port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     346            @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     347            port.set_cell_unique                          # セル一つだけ最適化
     348            port.set_skelton_useless                      # スケルトン関数不要最適化
     349            port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    383350
    384351            if $verbose then
     
    386353            end
    387354          else
    388             port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
     355            port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
    389356
    390357            if $verbose then
     
    393360          end
    394361
    395         else  # 呼びå
    396 ˆãŒè¤‡æ•°ã®ã‚»ãƒ«ï¼ˆå˜ä¸€ã®ãƒãƒ¼ãƒˆï¼‰
    397 
    398           # 呼び口は optional で初期化されていない、または受け口はé
    399 åˆ—ではないか?
     362        else  # 呼び先が複数のセル(単一のポート)
     363
     364          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    400365          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    401366            if ! @singleton then
    402               port.set_skelton_useless                    # スケルトン関数不要最適化
    403               port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     367              port.set_skelton_useless                    # スケルトン関数不要最適化
     368              port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    404369
    405370              if $verbose then
     
    407372              end
    408373            else
    409               port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     374              port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    410375
    411376              if $verbose then
     
    417382
    418383        port.set_only_callee( port_ports[0], port_cells[0] )
    419            # set_cell_unique でない場合 cell は意味がない
     384           # set_cell_unique でない場合 cell は意味がない
    420385
    421386      end
     
    426391  end
    427392
    428   #=== Celltype#受け口最適化
    429   # optimize_entry は、呼び口最適化の結果を使用している
     393  #=== Celltype#受け口最適化
     394  # optimize_entry は、呼び口最適化の結果を使用している
    430395  def optimize_entry
    431     # 受け口最適化の設定
     396    # 受け口最適化の設定
    432397    @port.each{ |port|
    433398      next if port.get_port_type != :CALL
    434399
    435       # 呼び口側の最適化状æ
    436 ‹
     400      # 呼び口側の最適化状態
    437401      b_VMT_useless     = port.is_VMT_useless?
    438402      b_skelton_useless = port.is_skelton_useless?
    439403
    440       # セルの参ç
    441 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     404      # セルの参照するセルを集める(ポートも一緒に集める)
    442405      @cell_list.each{ |cell|
    443406
     
    449412        j = jl.get_item( port.get_name )
    450413
    451         if j then    # optional で結合されていない場合 nil
     414        if j then    # optional で結合されていない場合 nil
    452415          if j.get_array_member2 then
    453             # 呼び口é
    454 åˆ—
     416            # 呼び口配列
    455417            j.get_array_member2.each { |j2|
    456418              if j2 then
    457                 port2 = j2.get_rhs_port   # 右辺のポート
    458                 # 受け口側の最適化可能性を設定
     419                port2 = j2.get_rhs_port   # 右辺のポート
     420                # 受け口側の最適化可能性を設定
    459421                port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    460422              #else
    461               #  optional で呼び口é
    462 åˆ—要素が初期化されていない
     423              #  optional で呼び口配列要素が初期化されていない
    463424              end
    464425            }
    465426          else
    466             port2 = j.get_rhs_port      # 右辺のポート
    467             # 受け口側の最適化可能性を設定
     427            port2 = j.get_rhs_port      # 右辺のポート
     428            # 受け口側の最適化可能性を設定
    468429            port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    469430          end
     
    473434  end
    474435
    475   #Celltype# リセットする
     436  #Celltype# リセットする
    476437  def reset_optimize
    477     @@ID_BASE = ID_BASE      # 本当は一回だけでよい
    478     @id_base = 1             # set_cell_id でリセットされるので不要
    479 
    480     @b_cp_optimized = false  # 呼び口最適化
    481     @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
    482     @n_cell_gen = 0          # 生成セル個数
     438    @@ID_BASE = ID_BASE      # 本当は一回だけでよい
     439    @id_base = 1             # set_cell_id でリセットされるので不要
     440
     441    @b_cp_optimized = false  # 呼び口最適化
     442    @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
     443    @n_cell_gen = 0          # 生成セル個数
    483444    @port.each{ |p|
    484445      p.reset_optimize
     
    488449  end
    489450
    490   #Celltype# ヘッダは include されているか
    491   #hname::Symbol : ヘッダ名
    492   #RETURN:: bool_t: false インクルードされていない、true インクルードされている
    493   # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
    494   # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
     451  #Celltype# ヘッダは include されているか
     452  #hname::Symbol : ヘッダ名
     453  #RETURN:: bool_t: false インクルードされていない、true インクルードされている
     454  # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
     455  # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
    495456  def header_included?( hname )
    496457    if @included_header[ hname ] == nil then
Note: See TracChangeset for help on using the changeset viewer.