Index: asp3_gr_sakura/trunk/tecsgen/tecslib/core/optimize.rb
===================================================================
--- asp3_gr_sakura/trunk/tecsgen/tecslib/core/optimize.rb	(revision 317)
+++ asp3_gr_sakura/trunk/tecsgen/tecslib/core/optimize.rb	(revision 318)
@@ -6,49 +6,34 @@
 #   Copyright (C) 2008-2014 by TOPPERS Project
 #--
-#   ä¸è¨èä½æ¨©è
-ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§
-#   ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ãä½¿ç¨ã»è¤è£½ã»æ¹
-#   å¤ã»åé
-å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
-#   (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
-#       æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
-#       ã¹ã³ã¼ãä¸­ã«å«ã¾ãã¦ãããã¨ï¼
-#   (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
-#       ç¨ã§ããå½¢ã§åé
-å¸ããå ´åã«ã¯ï¼åé
-å¸ã«ä¼´ããã­ã¥ã¡ã³ãï¼å©ç¨
-#       è
-ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
-#       ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
-#   (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
-#       ç¨ã§ããªãå½¢ã§åé
-å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
-#       ã¨ï¼
-#     (a) åé
-å¸ã«ä¼´ããã­ã¥ã¡ã³ãï¼å©ç¨è
-ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
-#         ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
-#     (b) åé
-å¸ã®å½¢æ
-ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSãã­ã¸ã§ã¯ãã«
-#         å ±åãããã¨ï¼
-#   (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
-#       å®³ãããï¼ä¸è¨èä½æ¨©è
-ããã³TOPPERSãã­ã¸ã§ã¯ããå
-è²¬ãããã¨ï¼
-#       ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç
-#       ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è
-ããã³TOPPERSãã­ã¸ã§ã¯ãã
-#       å
-è²¬ãããã¨ï¼
+#   上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
+#   ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+#   変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+#   (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+#       権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+#       スコード中に含まれていること．
+#   (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+#       用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+#       者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+#       の無保証規定を掲載すること．
+#   (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+#       用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+#       と．
+#     (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+#         作権表示，この利用条件および下記の無保証規定を掲載すること．
+#     (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+#         報告すること．
+#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+#       害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+#       また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+#       由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+#       免責すること．
 #  
-#   æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è
-ã
-#   ãã³TOPPERSãã­ã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç
-#   ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§
-#   ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæå®³ã«é¢ãã¦ãï¼ã
-#   ã®è²¬ä»»ãè² ããªãï¼
+#   本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+#   よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+#   に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+#   アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+#   の責任を負わない．
 #  
-#   $Id: optimize.rb 2300 2015-12-06 11:23:27Z okuma-top $
+#   $Id$
 #++
 
@@ -58,20 +43,20 @@
 Other processes are setting ID for each cell and setting domain information
 
-ãã®ãã¡ã¤ã«ã«ã¯ãæå³è§£æããã³ã¼ãçæã®éã§è¡ãã¹ãå¦çãå«ã¾ããï¼
-æé©åããã®ä¸ã¤ã§ããï¼
-ãã®ä»ã«ãã»ã«æ¯ã® ID ä»ãããã¡ã¤ã³ãããè¡ãï¼
-ã³ã¼ãçæå¯¾è±¡ã¨ãªãã»ã«ãå¯¾è±¡ã«å¦çãè¡ããã®ãå«ã¾ããï¼
+このファイルには、意味解析からコード生成の間で行うべき処理が含まれる．
+最適化もその一つである．
+その他に、セル毎の ID 付け、ドメインわけを行う．
+コード生成対象となるセルを対象に処理を行うものが含まれる．
 =end
 
 class Namespace
 
-  #===  åã»ã«ã« ID ï¼æ´æ°å¤ï¼ãå²ä»ãã
+  #===  各セルに ID （整数値）を割付ける
   def set_cell_id_and_domain
-    # celltype ã®åã»ã«ã« ID ãå²ä»ãã
+    # celltype の各セルに ID を割付ける
     @celltype_list.each { |t|
       t.set_cell_id_and_domain
     }
 
-    # ãµããã¼ã ã¹ãã¼ã¹ã®åã»ã«ã« ID ãå²ä»ãã
+    # サブネームスペースの各セルに ID を割付ける
     @namespace_list.each { |n|
       n.set_cell_id_and_domain
@@ -80,10 +65,10 @@
 
   def optimize
-    # celltype ã®æé©å
+    # celltype の最適化
     @celltype_list.each { |t|
       t.optimize
     }
 
-    # ãµããã¼ã ã¹ãã¼ã¹ã®æé©å
+    # サブネームスペースの最適化
     @namespace_list.each { |n|
       n.optimize
@@ -92,10 +77,10 @@
 
   def reset_optimize
-    # celltype ã®æé©å
+    # celltype の最適化
     @celltype_list.each { |t|
       t.reset_optimize
     }
 
-    # ãµããã¼ã ã¹ãã¼ã¹ã®æé©å
+    # サブネームスペースの最適化
     @namespace_list.each { |n|
       n.reset_optimize
@@ -106,5 +91,5 @@
 class Celltype
 
-  ID_BASE = 1               # reset_optimize ã§ãªã»ãããã
+  ID_BASE = 1               # reset_optimize でリセットする
   @@ID_BASE = ID_BASE
 
@@ -114,5 +99,5 @@
   end
 
-  #=== åã»ã«ã« ID ï¼æ´æ°å¤ï¼ãå²ä»ãã
+  #=== 各セルに ID （整数値）を割付ける
   def set_cell_id
 
@@ -122,8 +107,7 @@
 
     if $unique_id then
-      @id_base = @@ID_BASE   # id ãã·ã¹ãã å
-¨ä½ã§é£çªã«ãã
+      @id_base = @@ID_BASE   # id をシステム全体で連番にする
     else
-      @id_base = 1           # base ãå¸¸ã« 1 ããå§ãã
+      @id_base = 1           # base を常に 1 から始める
     end
 
@@ -131,5 +115,5 @@
     no_id_specified_cells = []
 
-    # ãã­ãã¿ã¤ããé¤ããæ°ãæ±ãã
+    # プロトタイプを除いた数を求める
     @cell_list.each{ |c|
       if c.is_generate? then
@@ -148,6 +132,6 @@
     }
 
-    @ordered_cell_list = []   # id = 1 ãæ·»æ° 0 ã«æ ¼ç´ããã
-    # ID æå®ããã¦ããã»ã«ã« id çªå·ãä¸ãã
+    @ordered_cell_list = []   # id = 1 が添数 0 に格納される
+    # ID 指定されているセルに id 番号を与える
     id_specified_cells.each{ |c|
       id = c.get_specified_id
@@ -169,5 +153,5 @@
       end
       @ordered_cell_list[ id - 1 ] = c
-      # éãçªå·ã¨ããå ´åã®ãã @id_base ãå ãã
+      # 通し番号とする場合のため @id_base を加える
       c.set_id( @id_base - 1 + id )
       if $verbose then
@@ -176,5 +160,5 @@
     }
 
-    # ID æå®ããã¦ããªãã»ã«ã« id çªå·ãä¸ãã
+    # ID 指定されていないセルに id 番号を与える
     i = 0
     no_id_specified_cells.each{ |c|
@@ -226,5 +210,5 @@
 
     @domain_roots.each{ |dn, regions|
-      # domain_type ã¯ä¸ã¤ã®ãã¼ãã«ä¸ã¤ãããªãã®ã§ãä¸ã¤ã®è¦ç´ ãç¡æ¡ä»¶ã§åãåºã
+      # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
       if regions.length > 1 then
         cdl_info( "celltype:#{@name} has cells in multi domain.\n" )
@@ -239,6 +223,5 @@
   def optimize
 
-    # port ã®åç
-§ããã»ã«ã¿ã¤ãã®æ°ãã»ã«ã®æ°ãæ±ãã
+    # port の参照するセルタイプの数、セルの数を求める
     if $verbose then
       print "=== optimizing celltype #{get_namespace_path.to_s} ===\n"
@@ -248,9 +231,9 @@
       next if port.get_port_type != :CALL
       if port.is_omit? then
-        # å¼ã³å£æé©åå®æ½
+        # 呼び口最適化実施
         @b_cp_optimized = true
-        @n_call_port_omitted_in_CB += 1               # CB ã§çç¥ããå¼ã³å£
-        port.set_skelton_useless                      # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å
-        port.set_VMT_useless                          # VMT ä¸è¦æé©å (ç´æ¥åãå£é¢æ°ãå¼åºã)
+        @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
+        port.set_skelton_useless                      # スケルトン関数不要最適化
+        port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
         if $verbose then
           print "optimized by omit: port: #{port.get_name} : o\n"
@@ -263,11 +246,8 @@
       end
 
-      port_cells = []    # å¼ã³å
-ã»ã«
-      port_ports = []    # å¼ã³å
-ã®ãã¼ã
-
-      # ã»ã«ã®åç
-§ããã»ã«ãéããï¼ãã¼ããä¸ç·ã«éããï¼
+      port_cells = []    # 呼び先セル
+      port_ports = []    # 呼び先のポート
+
+      # セルの参照するセルを集める（ポートも一緒に集める）
       @cell_list.each{ |cell|
 
@@ -281,14 +261,11 @@
         if j then
           if j.get_array_member2 then
-            # å¼ã³å£é
-åã®å ´åãå
-¨é¨ã®çµåå
-ãéãã
+            # 呼び口配列の場合、全部の結合先を集める
             j.get_array_member2.each { |j2|
               if j2 then
                 port_cells << j2.get_rhs_cell
-                port_ports << j2.get_rhs_port   # å³è¾ºã®ãã¼ã
+                port_ports << j2.get_rhs_port   # 右辺のポート
               else
-                # optional ã§ãããæ·»æ°ã®ã¿åæåããã¦ããªãï¼ãã¹ã¦åæåãããªãå ´åã¯ãä¸ï¼
+                # optional で、ある添数のみ初期化されていない（すべて初期化されない場合は、下）
                 port_cells << nil
                 port_ports << nil
@@ -296,51 +273,41 @@
             }
           else
-            # å
-¨ã¦ã®çµåå
-ãéãã
+            # 全ての結合先を集める
             port_cells << j.get_rhs_cell
-            port_ports << j.get_rhs_port   # å³è¾ºã®ãã¼ã
+            port_ports << j.get_rhs_port   # 右辺のポート
           end
         else
-          # optional ã§åæåããã¦ããªãï¼nil ãè¦ç´ ã«å ãã¦ããï¼
+          # optional で初期化されていない（nil を要素に加えておく）
           port_cells << nil
-          port_ports << nil   # å³è¾ºã®ãã¼ã
+          port_ports << nil   # 右辺のポート
         end
       }
 
-      # éè¤è¦ç´ ãåãé¤ã
+      # 重複要素を取り除く
       port_cells.uniq!
       port_ports.uniq!
 
-      # å¼ã³å£ã®å¼ã³å
-ãä¸ã¤ã®ãã¼ãã ããï¼
+      # 呼び口の呼び先が一つのポートだけか？
       if port_ports.length == 1 then
 
-        # å¼ã³å£é
-åãå¯å¤é·ã®å ´åãæé©åããªã
-             # mikan å¼ã³å£é
-åè¦ç´ æ°ãã¯ã­ä¸å
-·åæ«å®å¯¾ç­
-             # ããæã¾ããä¿®æ­£ã¯ãåãå£ã¸ã®ãã¤ã³ã¿ã¯çç¥ããããé
-ååæ°ã¯åºåãã(#_CP_#, #_TCP_#)
-             # ããã«é
-ååæ°ãå®æ°åã§ããã®ã§ããã°ãå®æ°ãã¯ã­ãåºå (#_NCPA_#)
+        # 呼び口配列が可変長の場合、最適化しない
+             # mikan 呼び口配列要素数マクロ不具合暫定対策
+             # より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#)
+             # さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
         next if port.get_array_size == "[]"
 
-        # å¼ã³å£æé©åå®æ½
+        # 呼び口最適化実施
         @b_cp_optimized = true
 
-        # å¼ã³å
-ãä¸ã¤ã®ã»ã«ã ããï¼
+        # 呼び先が一つのセルだけか？
         if port_cells.length == 1 then
 
-          # å¼ã³å£ã¯ optional ã§åæåããã¦ããªããã¾ãã¯åãå£ã¯é
-åã§ã¯ãªããï¼
+          # 呼び口は optional で初期化されていない、または受け口は配列ではないか？
           if port_ports[0] == nil || port_ports[0].get_array_size == nil then
 
-            @n_call_port_omitted_in_CB += 1               # CB ã§çç¥ããå¼ã³å£
-            port.set_cell_unique                          # ã»ã«ä¸ã¤ã ãæé©å
-            port.set_skelton_useless                      # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å
-            port.set_VMT_useless                          # VMT ä¸è¦æé©å (ç´æ¥åãå£é¢æ°ãå¼åºã)
+            @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
+            port.set_cell_unique                          # セル一つだけ最適化
+            port.set_skelton_useless                      # スケルトン関数不要最適化
+            port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
 
             if $verbose then
@@ -348,5 +315,5 @@
             end
           else
-            port.set_VMT_useless                          # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ°ãå¼åºã)
+            port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
 
             if $verbose then
@@ -355,13 +322,11 @@
           end
 
-        else  # å¼ã³å
-ãè¤æ°ã®ã»ã«ï¼åä¸ã®ãã¼ãï¼
-
-          # å¼ã³å£ã¯ optional ã§åæåããã¦ããªããã¾ãã¯åãå£ã¯é
-åã§ã¯ãªããï¼
+        else  # 呼び先が複数のセル（単一のポート）
+
+          # 呼び口は optional で初期化されていない、または受け口は配列ではないか？
           if port_ports[0] == nil || port_ports[0].get_array_size == nil then
             if ! @singleton then
-              port.set_skelton_useless                    # ã¹ã±ã«ãã³é¢æ°ä¸è¦æé©å
-              port.set_VMT_useless                        # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ° or åãå£é¢æ°ãå¼åºã)
+              port.set_skelton_useless                    # スケルトン関数不要最適化
+              port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
 
               if $verbose then
@@ -369,5 +334,5 @@
               end
             else
-              port.set_VMT_useless                           # VMT ä¸è¦æé©å (ã¹ã±ã«ãã³é¢æ° or åãå£é¢æ°ãå¼åºã)
+              port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
 
               if $verbose then
@@ -379,5 +344,5 @@
 
         port.set_only_callee( port_ports[0], port_cells[0] )
-           # set_cell_unique ã§ãªãå ´å cell ã¯æå³ããªã
+           # set_cell_unique でない場合 cell は意味がない
 
       end
@@ -387,15 +352,13 @@
     }
 
-    # åãå£æé©åã®è¨­å®
+    # 受け口最適化の設定
     @port.each{ |port|
       next if port.get_port_type != :CALL
 
-      # å¼ã³å£å´ã®æé©åç¶æ
-
+      # 呼び口側の最適化状態
       b_VMT_useless     = port.is_VMT_useless?
       b_skelton_useless = port.is_skelton_useless?
 
-      # ã»ã«ã®åç
-§ããã»ã«ãéããï¼ãã¼ããä¸ç·ã«éããï¼
+      # セルの参照するセルを集める（ポートも一緒に集める）
       @cell_list.each{ |cell|
 
@@ -407,21 +370,19 @@
         j = jl.get_item( port.get_name )
 
-        if j then    # optional ã§çµåããã¦ããªãå ´å nil
+        if j then    # optional で結合されていない場合 nil
           if j.get_array_member2 then
-            # å¼ã³å£é
-å
+            # 呼び口配列
             j.get_array_member2.each { |j2|
               if j2 then
-                port2 = j2.get_rhs_port   # å³è¾ºã®ãã¼ã
-                # åãå£å´ã®æé©åå¯è½æ§ãè¨­å®
+                port2 = j2.get_rhs_port   # 右辺のポート
+                # 受け口側の最適化可能性を設定
                 port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
               #else
-              #  optional ã§å¼ã³å£é
-åè¦ç´ ãåæåããã¦ããªã
+              #  optional で呼び口配列要素が初期化されていない
               end
             }
           else
-            port2 = j.get_rhs_port      # å³è¾ºã®ãã¼ã
-            # åãå£å´ã®æé©åå¯è½æ§ãè¨­å®
+            port2 = j.get_rhs_port      # 右辺のポート
+            # 受け口側の最適化可能性を設定
             port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
           end
@@ -431,12 +392,12 @@
   end
 
-  #Celltype# ãªã»ãããã
+  #Celltype# リセットする
   def reset_optimize
-    @@ID_BASE = ID_BASE      # æ¬å½ã¯ä¸åã ãã§ãã
-    @id_base = 1             # set_cell_id ã§ãªã»ãããããã®ã§ä¸è¦
-
-    @b_cp_optimized = false  # å¼ã³å£æé©å
-    @n_call_port_omitted_in_CB = 0 # å¼ã³å£æé©åã«ããä¸çæã¨ãªã£ããã¼ãã®æ°
-    @n_cell_gen = 0          # çæã»ã«åæ°
+    @@ID_BASE = ID_BASE      # 本当は一回だけでよい
+    @id_base = 1             # set_cell_id でリセットされるので不要
+
+    @b_cp_optimized = false  # 呼び口最適化
+    @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
+    @n_cell_gen = 0          # 生成セル個数
     @port.each{ |p|
       p.reset_optimize
@@ -446,9 +407,9 @@
   end
 
-  #Celltype# ãããã¯ include ããã¦ããã
-  #hname::Symbol : ãããå
-  #RETURN:: bool_t: false ã¤ã³ã¯ã«ã¼ãããã¦ããªããtrue ã¤ã³ã¯ã«ã¼ãããã¦ãã
-  # #_ISH_#, #_ICT_# ã§ããããåãè¾¼ã¾ãã¦ããããã§ãã¯ãã
-  # false ãè¿ã£ãå ´åãhname ã¯ç»é²ããã¦ãæ¬¡åã®å¼ã³åºãã§ã¯ true ãè¿ã
+  #Celltype# ヘッダは include されているか
+  #hname::Symbol : ヘッダ名
+  #RETURN:: bool_t: false インクルードされていない、true インクルードされている
+  # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
+  # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
   def header_included?( hname )
     if @included_header[ hname ] == nil then
