- 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/tecsgen.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 : tecsgen.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 … … 56 41 class TECSGEN 57 42 58 #=== import ãã¹ (-I) ãæ«å°¾ã«è¿½å59 # æ¢ã«ç»é²æ¸ã¿ã§ããã°ã追å ããªã43 #=== import パス (-I) を末尾に追加 44 # 既に登録済みであれば、追加しない 60 45 def self.add_import_path path 61 46 if $import_path.index( path ) == nil then … … 65 50 end 66 51 67 #=== EXEB çã®ãã¹ã®èª¿æ´68 # ç°å¢å¤æ° TECSPATH ã cygwin ã¹ã¿ã¤ã«ã ã¨ãexerb çã§ã¯æ±ããªã69 # $import_path 㨠$TECSPATH ã調æ´ãã52 #=== EXEB 版のパスの調整 53 # 環境変数 TECSPATH が cygwin スタイルだと、exerb 版では扱えない 54 # $import_path と $TECSPATH を調整する 70 55 def self.adjust_exerb_path 71 56 if $IN_EXERB then … … 74 59 paths = [] 75 60 $import_path.each{ |path| 76 # cygpath 㯠'..' ãç°¡ç´ãã¦ãã¾ãã®ã§ãnew_tecspath ã§ç½®æãã61 # cygpath は '..' を簡約してしまうので、new_tecspath で置換する 77 62 # paths << cygpath( path, path ) 78 63 paths << path.sub( pattern, new_tecspath ) … … 85 70 end 86 71 87 #=== $(TECSPATH) ã¸ã®ç½®æ88 #path::String : ENV[ 'TECSPATH' ] ã«ä¸è´ããé¨åãããã°ã "$(TECSPATH)" ã«ç½®æ89 #b_global::Bool : true ãªã gsub ã§ç½®æãfalse ãªã sub ã§ç½®æ72 #=== $(TECSPATH) への置換 73 #path::String : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換 74 #b_global::Bool : true なら gsub で置換。false なら sub で置換 90 75 def self.subst_tecspath( path, b_global = false ) 91 76 tp = $tecspath.dup … … 102 87 end 103 88 104 #=== path ã¯çµ¶å¯¾ãã¹ã?89 #=== path は絶対パスか? 105 90 #path:: String : 106 # '/' ã¾ã㯠'$' ã§å§ã¾ãå ´åã絶対ãã¹ã¨å¤å®ãã91 # '/' または '$' で始まる場合、絶対パスと判定する 107 92 def self.is_absolute_path?( path ) 108 93 pa = path[0..0]; pa2 = path[0..1] … … 116 101 end 117 102 118 #=== tecsgen ã®ããã©ã«ããè¨å®103 #=== tecsgen のデフォルトを設定 119 104 def self.set_default_config 120 105 Makefile::set_default_config … … 122 107 123 108 ### 124 #== Makefile.templ ã®åºåå 125 容ã追å ãå¤æ´ããããã®æä½ 109 #== Makefile.templ の出力内容を追加、変更するための操作 126 110 module Makefile 127 # åºå®ããã¦ããå¤æ°(add_var ã§å¤æ´ã§ããªã)111 # 固定されている変数(add_var で変更できない) 128 112 @@fixed_vars = { :INCLUDES => nil, :DEFINES => nil, :TARGET_BASE => nil, :BASE_DIR => nil } 129 113 @@config_mode = false … … 140 124 @@lines = [] 141 125 142 #=== OTHER_OBJS ã«è¿½å ãã126 #=== OTHER_OBJS に追加する 143 127 def self.add_obj obj 144 128 @@objs << obj 145 129 end 146 #=== 追å ããå¤æ°147 # ãã©ã°ã¤ã³ããã¯ãããã©ã«ãå¤ãå¤æ´ã§ãã148 # config ã«ãã130 #=== 追加する変数 131 # プラグインからは、デフォルト値を変更できる 132 # config により 149 133 def self.add_var( var, val, comment = nil ) 150 134 if @@fixed_vars[ var ] … … 159 143 end 160 144 end 161 #=== LDFLAGS ã«è¿½å ãã145 #=== LDFLAGS に追加する 162 146 def self.add_ldflag ldflag 163 147 @@ldflags += " " + ldflag 164 148 end 165 #=== ãµã¼ããã¹ã追å ãã166 # CFLAGS, vpath ã«è¿½å ãã149 #=== サーチパスを追加する 150 # CFLAGS, vpath に追加する 167 151 def self.add_search_path path 168 152 @@search_path << path 169 153 end 170 #=== PRE_TECSGEN_TARGET ã«è¿½å ãã171 # PRE_TECSGEN_TARGET ã« target ã追å ãã154 #=== PRE_TECSGEN_TARGET に追加する 155 # PRE_TECSGEN_TARGET に target を追加する 172 156 def self.add_pre_tecsgen_target target 173 157 @@pre_tecsgen_target << pre_tecsgen_target 174 158 end 175 #=== POST_TECSGEN_TARGET ã«è¿½å ãã176 # POST_TECSGEN_TARGET ã« target ã追å ãã159 #=== POST_TECSGEN_TARGET に追加する 160 # POST_TECSGEN_TARGET に target を追加する 177 161 def self.add_post_tecsgen_target target 178 162 @@post_tecsgen_target << pre_tecsgen_target 179 163 end 180 #=== 追å ããå¤æ°164 #=== 追加する変数 181 165 def self.add_line( line ) 182 166 @@lines << line.to_s + "\n" 183 167 end 184 168 185 def self.get_objs # Array ãè¿ã169 def self.get_objs # Array を返す 186 170 return @@objs.uniq 187 171 end 188 def self.get_vars # Array ãè¿ã172 def self.get_vars # Array を返す 189 173 if RUBY_VERSION >= '1.9' then 190 174 return (@@vars.keys + @@vars_default.keys).sort.uniq 191 175 else 192 # V1.8 ã§ã¯ãSymbol ã® sort ãã§ããªãã®ã§ãä¸æ¦ String ã«ç½®æãã176 # V1.8 では、Symbol の sort ができないので、一旦 String に置換する 193 177 return (@@vars.keys + @@vars_default.keys).map{|s| s.to_s }.sort.uniq.map!{|s| s.to_sym } 194 178 end … … 200 184 return @@var_comments[ var ] 201 185 end 202 def self.get_ldflags # String ãè¿ã186 def self.get_ldflags # String を返す 203 187 return @@ldflags 204 188 end 205 def self.get_search_path # Array ãè¿ã189 def self.get_search_path # Array を返す 206 190 return @@search_path.uniq 207 191 end 208 def self.get_pre_tecsgen_target # Array ãè¿ã192 def self.get_pre_tecsgen_target # Array を返す 209 193 return @@pre_tecsgen_target.uniq 210 194 end 211 def self.get_post_tecsgen_target # Array ãè¿ã195 def self.get_post_tecsgen_target # Array を返す 212 196 return @@post_tecsgen_target.uniq 213 197 end 214 def self.get_lines # ä»å ããè¡ãå¾ã198 def self.get_lines # 付加する行を得る 215 199 return @@lines.uniq 216 200 end 217 201 218 #=== TECSGEN ã®ããã©ã«ãè¨å®ãè¡ã202 #=== TECSGEN のデフォルト設定を行う 219 203 # Makefile 220 # @@fixed_vars ã§å®ç¾©ããã¦ããå¤æ°ã¯ãå¤æ´ã§ãããå®æ°å®ç¾©ããã¦ãã204 # @@fixed_vars で定義されている変数は、変更できず、定数定義されている 221 205 def self.set_default_config 222 206 add_var( "TARGET", "$(TARGET_BASE).exe", "default target name" ) … … 235 219 236 220 def syntax_analisys argv 237 # ã«ã¼ã namespace (region) ãçæ221 # ルート namespace (region) を生成 238 222 @root_namespace = Region.new("::") 239 223 240 #### æ§æ解æ (post ã³ã¼ããé¤ã) ####241 # ãã¹ã¦ã® cdl ã import ãã224 #### 構文解析 (post コードを除く) #### 225 # すべての cdl を import する 242 226 argv.each{ |f| 243 227 dbgPrint( "## Import: #{f}\n") … … 245 229 } 246 230 247 # ãã¹ã¦ã®æ§æ解éãå®äºãããã¨ã®å ±å248 # å®éã«ã¯ãå¾ãããã©ã°ã¤ã³ã®çæãã CDL ã®ãã¼ã¹ãè¡ããã249 # ã¨ã©ã¼è¡æ°ã®æ±ºå®æ¹æ³ã®å¤æ´ã®ããã«è¡ã231 # すべての構文解釈が完了したことの報告 232 # 実際には、後からプラグインの生成する CDL のパースが行われる 233 # エラー行数の決定方法の変更のために行う 250 234 Generator.end_all_parse 251 235 dbgPrint( "## End all parse (except Post Code)\n") … … 253 237 254 238 def semantics_analisys_1 255 #### æå³è§£æï¼ (post ã³ã¼ããé¤ã) ####239 #### 意味解析1 (post コードを除く) #### 256 240 dbgPrint( "## Creating reverse join \n") 257 241 Cell.create_reverse_join 258 242 259 #0 set_definition_join ã¯2åå¼ã³åºãããï¼1åç®ï¼243 #0 set_definition_join は2回呼び出される(1回目) 260 244 dbgPrint( "## Checking all join\n") 261 245 @root_namespace.set_definition_join 262 # @root_namespace.set_require_join ### ãã£ããè¦åãããéè¤ã¨ã©ã¼ãè¦éã263 # through ãã©ã°ã¤ã³ã§çæãããã»ã«ã«ã require ãçæã§ãã (set_definition_join ã®å¾ãã§å®æ½)264 265 #### post ã³ã¼ãã®çæã¨æ§æ解æ####266 # å¼æ°ããªããã°ããã©ã°ã¤ã³ã®ãã¹ãã³ã¼ããåºåããªã246 # @root_namespace.set_require_join ### いったん見合わせ。重複エラーを見逃す 247 # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施) 248 249 #### post コードの生成と構文解析 #### 250 # 引数がなければ、プラグインのポストコードを出力しない 267 251 if ARGV.length > 0 then 268 252 dbgPrint( "## Generating Post Code\n") 269 # ãã©ã°ã¤ã³ã®ãã¹ãã³ã¼ãã®åºåã¨import253 # プラグインのポストコードの出力と import 270 254 tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl" 271 255 file = nil … … 277 261 278 262 if file then 279 # through ãã©ã°ã¤ã³ã®ãã¹ãã³ã¼ãçæ263 # through プラグインのポストコード生成 280 264 PluginModule.gen_plugin_post_code file 281 265 … … 290 274 end 291 275 292 #### æå³è§£æï¼ (post ã³ã¼ã) ####276 #### 意味解析1 (post コード) #### 293 277 dbgPrint( "## Creating reverse join (for post code) \n") 294 278 Cell.create_reverse_join 295 279 296 # Join ã®å®ç¾©ã®è¨å®ã¨ãã§ã㯠297 #0 # åæ¹åç 298 §å¯¾å¿ 299 #0 set_definition_join ã¯2åå¼ã³åºãããï¼2åç®ï¼ post_code ã§çæããã 280 # Join の定義の設定とチェック 281 #0 # 前方参照対応 282 #0 set_definition_join は2回呼び出される(2回目) post_code で生成された 300 283 dbgPrint( "## Checking all join (for cells generated by Post Code\n") 301 284 @root_namespace.set_definition_join 302 285 303 286 dbgPrint( "## Set require join\n") 304 @root_namespace.set_require_join # mikan post ã®åã«ã 305 # ãã¹ãã³ã¼ãã§çæãããã»ã«ã® require ã®join ãçæ 306 # mikan require 㧠through ãé©ç¨ããã¦ããã¹ãã³ã¼ããå¿ 307 è¦ã¨ãªã£ã¦ãåºåãããªã 287 @root_namespace.set_require_join # mikan post の前にも 288 # ポストコードで生成されたセルの require のjoin を生成 289 # mikan require で through が適用されて、ポストコードが必要となっても出力されない 308 290 end # semantics_analisys_1 309 291 310 292 def semantics_analisys_2 311 #### æå³è§£æï¼####293 #### 意味解析2 #### 312 294 Cell.make_cell_list2 313 295 dbgPrint( "## Set fixed join\n") 314 296 Cell.create_reverse_require_join 315 # create_reverse_require_join 㯠set_detinition_join ã«åãè¾¼ããã¨ãã§ããªã 316 # namespace ã«ä¾åããªãåºç¾é ã§è¡ã 317 # mikan through ãã©ã°ã¤ã³ãé©ç¨ãããã¹ãã³ã¼ãã«å½±é¿ãä¸ããå ´åãèæ 318 ®ã§ãã¦ããªã 319 # mikan post code ã«å½±é¿ã®ãããã®ã§ããã°ãæ©ãã« reverse_require_join ã®çµåãå¿ 320 è¦ 297 # create_reverse_require_join は set_detinition_join に埋め込むことができない 298 # namespace に依存しない出現順で行う 299 # mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない 300 # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要 321 301 dbgPrint( "## Setting port reference count\n") 322 302 @root_namespace.set_port_reference_count … … 325 305 @root_namespace.check_join 326 306 327 # mikan ãã©ã°ã¤ã³ã§çæãããã³ã³ãã¼ãã³ãã®set_def_and_check_join307 # mikan プラグインで生成されたコンポーネントの set_def_and_check_join 328 308 329 309 dbgPrint( "## Checking referenced but undefined cell\n") … … 332 312 333 313 def optimize_and_generate 334 #### Region link root ãã¨ã«ãªããã£ãã¤ãºããã³çæ####314 #### Region link root ごとにオプティマイズおよび生成 #### 335 315 Region.get_link_roots.each { |region| 336 316 … … 354 334 end 355 335 356 # ã»ã«ãä¸ã¤ããªããã°çæããªã357 # ã»ã«ã®çæããªãå ´å336 # セルが一つもなければ生成しない 337 # セルの生成がない場合 358 338 if region.get_n_cells == 0 then 359 339 if $region_list.length > 0 then … … 385 365 386 366 dbgPrint( "## Unset optimize variables\n") 387 @root_namespace.reset_optimize # æé©åããªã»ãããã367 @root_namespace.reset_optimize # 最適化をリセットする 388 368 389 369 if Generator.get_n_error == 0 then 390 # ã¨ã©ã¼ãçºçãã¦ããããè¨å®ããªã370 # エラーが発生していたら、設定しない 391 371 dbgPrint( "## Set cell id\n") 392 @root_namespace.set_cell_id_and_domain # ã»ã«ã® ID ã¨ãã¡ã¤ã³æ 393 å ±ãè¨å®ï¼linkunit æ¯ã«0ããã¤ããï¼ 394 395 # ã¨ã©ã¼ãçºçãã¦ããããæé©åã¯å®æ½ããªã 372 @root_namespace.set_cell_id_and_domain # セルの ID とドメイン情報を設定(linkunit 毎に0からつける) 373 374 # エラーが発生していたら、最適化は実施しない 396 375 if ! $unopt then 397 376 dbgPrint( "## Optimizing: Link Region=#{@root_namespace.get_name}\n") … … 401 380 402 381 if $show_tree then 403 # ã¨ã©ã¼ãçºçãã¦ãã¦ã表示ï¼ã¨ã©ã¼çºçæã¯æé©åããã¦ããªãã®ã§æ³¨æï¼382 # エラーが発生していても表示(エラー発生時は最適化されていないので注意) 404 383 print "##### show_tree LinkRegion=#{region.get_name} #####\n" 405 384 @root_namespace.show_tree(0) … … 407 386 end 408 387 409 # æ§æ解éãæå³è§£æã§ã¨ã©ã¼çºçãã¦ããããã³ã¼ãçæãããªã388 # 構文解釈、意味解析でエラー発生していたら、コード生成をしない 410 389 if Generator.get_n_error != 0 then 411 390 print_report … … 413 392 end 414 393 415 #### ã³ã¼ãçæ####394 #### コード生成 #### 416 395 begin 417 396 dbgPrint( "## Generating: Link Region=#{@root_namespace.get_name}\n") … … 420 399 @root_namespace.generate_post 421 400 rescue 422 # é常ããã¸ã¯æ¥ãªã (generate, generate_post ã§å¦ç½®ããã)401 # 通常ここへは来ない (generate, generate_post で処置される) 423 402 Generator.error( "G9999 fail to generate" ) 424 403 end … … 438 417 } 439 418 440 # update ãã441 # APPFile ã§çæããããã¡ã¤ã«ã¯ãããå¤åãããã°ãããã§æ´æ°ãã442 # ã³ã¼ãçæ段éã§ã¨ã©ã¼ãçºçããã°ãæ´æ°ããªã443 # CFile ã§çæããããã®ã¯ãæ´æ°ããã¦ãã419 # update する 420 # APPFile で生成されたファイルは、もし変化があれば、ここで更新する 421 # コード生成段階でエラーが発生すれば、更新しない 422 # CFile で生成されたものは、更新されている 444 423 if Generator.get_n_error == 0 then 445 424 begin -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.