Class: TECSGEN
- Defined in:
- lib/tecsgen.rb,
lib/tecsgen/version.rb,
lib/tecsgen/core/tecsgen.rb,
lib/tecsgen/core/location.rb
Overview
TECS Generator
Generator for TOPPERS Embedded Component System
Copyright (C) 2008-2017 by TOPPERS Project
–
上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
(1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
権表示,この利用条件および下記の無保証規定が,そのままの形でソー
スコード中に含まれていること.
(2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
用できる形で再配布する場合には,再配布に伴うドキュメント(利用
者マニュアルなど)に,上記の著作権表示,この利用条件および下記
の無保証規定を掲載すること.
(3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
用できない形で再配布する場合には,次のいずれかの条件を満たすこ
と.
(a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
作権表示,この利用条件および下記の無保証規定を掲載すること.
(b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
報告すること.
(4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
免責すること.
本ソフトウェアは,無保証で提供されているものである.上記著作権者お
よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
の責任を負わない.
$Id: location.rb 2640 2017-06-03 11:27:12Z okuma-top $
++
Defined Under Namespace
Modules: Makefile Classes: Cell_location, Join_location
Constant Summary collapse
- PACKAGE =
"tecsgen"
- VERSION =
"1.G.2"
- COPYRIGHT =
"Copyright(c) 2008-2018, TOPPERS project. All rights reserved."
- LICENSE =
"TOPPERS License"
- @@current_tecsgen =
nil
- @@b_post_coded =
ポストコード生成開始後 true
false
Class Method Summary collapse
-
.add_import_path(path) ⇒ Object
import パス (-I) を末尾に追加 既に登録済みであれば、追加しない.
-
.analyze_option(additional_option_parser) ⇒ Object
initialize_global_var.
- .get_argv ⇒ Object
- .init(addtional_option_parser = nil) ⇒ Object
-
.initialize_global_var ⇒ Object
—– initialize_global_var —–#.
-
.is_absolute_path?(path) ⇒ Boolean
path は絶対パスか? path:: String : ‘/’ または ‘$’ で始まる場合、絶対パスと判定する.
-
.load_modules ⇒ Object
analyze_option.
-
.new_cell_location(cell_location) ⇒ Object
—— manupulate location information ——–#.
- .new_join_location(join_location) ⇒ Object
-
.post_coded? ⇒ Boolean
finalize.
-
.set_default_config ⇒ Object
tecsgen のデフォルトを設定.
-
.setup ⇒ Object
load_modules.
-
.subst_tecspath(path, b_global = false) ⇒ Object
$(TECSPATH) への置換 path::String : ENV[ ‘TECSPATH’ ] に一致する部分があれば、 “$(TECSPATH)” に置換 b_global::Bool : true なら gsub で置換。false なら sub で置換.
Instance Method Summary collapse
-
#finalize ⇒ Object
optimize_and_generate.
-
#get_cell_list ⇒ Object
TECSGEN#get_cell_list.
- #get_cell_location_list ⇒ Object
-
#get_celltype_list ⇒ Object
TECSGEN#get_celltype_list.
- #get_join_location_list ⇒ Object
- #get_root_namespace ⇒ Object
-
#initialize ⇒ TECSGEN
constructor
—– initialize ——-#.
- #new_cell_location(cell_location) ⇒ Object
- #new_join_location(join_location) ⇒ Object
-
#optimize_and_generate ⇒ Object
semantics_analisys_2.
- #run1 ⇒ Object
- #run2 ⇒ Object
-
#semantics_analisys_1 ⇒ Object
TECSGEN#semantics_analisys_1 semantics check.
-
#semantics_analisys_2 ⇒ Object
semantics_analisys_1.
-
#syntax_analisys(argv) ⇒ Object
—— TECSGEN CDL analyze and generate ——#.
Constructor Details
#initialize ⇒ TECSGEN
—– initialize ——-#
219 220 221 222 223 224 225 226 227 228 |
# File 'lib/tecsgen.rb', line 219 def initialize @cell_list = nil @cell_list2 = nil @celltype_list = nil @root_namespace = nil #--- obsolete ---# replaced to TOOL_INFO @cell_location_list = [] @join_location_list = [] end |
Class Method Details
.add_import_path(path) ⇒ Object
import パス (-I) を末尾に追加
既に登録済みであれば、追加しない
45 46 47 48 49 50 |
# File 'lib/tecsgen/core/tecsgen.rb', line 45 def self.add_import_path(path) if $import_path.index(path).nil? dbgPrint "add_import_path: '#{path}'\n" $import_path << path end end |
.analyze_option(additional_option_parser) ⇒ Object
initialize_global_var
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 |
# File 'lib/tecsgen.rb', line 326 def self.analyze_option(additional_option_parser) ### tecsgen コマンドオプション解析 ### ARGV. {|parser| parser. = "Usage: tecsgen [options] files" parser.on("-D", "--define=def", "define cpp symbol for import_C") {|define| $define << define } parser.on("-G", "--generate-region=path", "generate region") {|path| if path =~ /^::/ gen_path = path else gen_path = "::" + path end $region_list[gen_path] = true } parser.on("-I", "--import-path=path", "imoprt/import_C path") {|path| $import_path << path $import_path_opt << path } parser.on("-L", "--library-path=path", "path to dir where tecsgen.rb (obsolete, unnecessary to specify -L, those passes are gotten from tecsgen.rb") {|path| $library_path << path } parser.on("-R", "--RAM-initializer", "generate RAM initializer. INITIALIZE_TECS() must be called before running any TECS code."){ $ram_initializer = true } parser.on("-U", "--unoptimize", "unoptimize") { $unopt = true } parser.on("--unoptimize-entry", "unoptimize entry port") { $unopt_entry = true } parser.on("-c", "--cpp=cpp_cmd", "C pre-processor command used import_C (default: gcc -E -DTECSGEN), you can also specify by environment variable TECS_CPP"){|arg| $cpp = arg $b_cpp_specified = true } parser.on("-d", "--dryrun", "dryrun"){ $dryrun = true } parser.on("-f", "--force-overwrite", "force overwrite all files") { $force_overwrite = true } parser.on("-g", "--gen=dir", "generate dir") {|dir| $gen = $gen_base = dir } parser.on("-i", "--idx_is_id", "set idx_is_id to all celltypes") { $idx_is_id = true } # parser.on('-k', '--kcode=code', 'set kanji code: euc|sjis|none|utf8, none is default') { |code| parser.on("-k", "--kcode=code", "set kanji code: euc|sjis|none|utf8") {|code| $kcode = code } # old_mode は V1.0.C.22 で廃止 # parser.on('-o', '--old-mode', 'old mode' ){ # $old_mode = true # } parser.on("-r", "--ram", "RAM only"){ $rom = false } parser.on("-s", "--show-tree", "show parsing tree"){ $show_tree = true } parser.on("-t", "--generator-debug", "generator debug"){ $debug = true $verbose = true } parser.on("-u", "--unique-id", "assign unique id for each cell"){ $unique_id = true } parser.on("-v", "--verbose", "verbose mode"){ $verbose = true } parser.on("-y", "--yydebug", "yydebug"){ $yydebug = true } parser.on("--no-banner", "not display banner") { $no_banner = true } parser.on("--version", "print version") { $print_version = true } parser.on("--unit-test", "unit verification (test tecsgen itself)") { $unit_test = true } parser.on("--generate-all-template", "generate all celltypes' templates") { $generate_all_template = true } parser.on("--generate-no-template", "generate no template") { $generate_no_template = true } parser.on("--no-default-import-path", "no default import path"){ $no_default_import_path = true } parser.on("--c-suffix=c", "C program suffix (default: c)"){| suffix | $c_suffix = suffix } parser.on("--h-suffix=h", "C program header suffix (default: h)"){| suffix | $h_suffix = suffix } # parser.on( '--include_path_opt_format', 'cpp include path option format, default: "-I %s"' ){ # } parser.version = # {TECSGEN::VERSION} parser.release = nil if additional_option_parser additional_option_parser.call(parser) end parser.parse! } if ARGV.empty? && !$print_version && !$unit_test && !$TECSFLOW ARGV.{|parser| puts parser.help exit 1 } end end |
.get_argv ⇒ Object
213 214 215 |
# File 'lib/tecsgen/core/tecsgen.rb', line 213 def self.get_argv ARGV end |
.init(addtional_option_parser = nil) ⇒ Object
208 209 210 211 212 213 214 215 216 |
# File 'lib/tecsgen.rb', line 208 def self.init(addtional_option_parser = nil) initialize_global_var analyze_option addtional_option_parser load_modules setup unless $TECSFLOW dbgPrint "tecspath: #{$tecsgen_base_path}, __FILE__=#{__FILE__}\n" dbgPrint "ARGV(remained): #{ARGV}, argments=#{$arguments}\n" end |
.initialize_global_var ⇒ Object
—– initialize_global_var —–#
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/tecsgen.rb', line 254 def self.initialize_global_var require "optparse" require "pp" ### グローバル変数定義 ### # コマンドライン引数 (Makefile.templ へ出力) $arguments = "" ARGV.each {|a| $arguments += " " + a } $unopt = false # bool: disable optimizing both call and entry port $unopt_entry = false # bool: disable optimizing entry port $gen_base = "gen" # string: folder path to place generated files $gen = $gen_base # string: folder path to place generated files $generate_all_template = false # bool: generarete template files for all celltypes (if non cell exist or system celltypes) $generate_no_template = false # bool: generarete no template file (neither celltype code nor Makefile) $idx_is_id = false # bool: all components are idx_is_id $unique_id = false # bool: assign unique id to each cell (otherwise begin from 1 for each celltype) $debug = false # bool: tecsgen debug message $dryrun = false # bool: dryrun mode: syntax is checked, but not generate any files $show_tree = false # bool: show parsing tree $verbose = false # bool: verbose mode: show some messages $yydebug = false # bool: yydebug: parser debug mode (need bnf-deb.tab.rb) $run_dir = Dir.pwd # string: tecsgen/tecscde start up directory $base_dir = { } # string=>bool: base dir for import_path (key:base_dir, val:actually used or specified directly) $import_path = ["."] # string array : import/import_C path $import_path_opt = [] # [String] $library_path = [$tecsgen_base_path] # string array : path to dir where tecsgen.rb placed $define = [] # string array : define $ram_initializer = false # bool: generate ram initializer $region_list = {} # string array : region path which is generated $generating_region = nil # Region: Region to optimisze & generate code # コマンドラインオプションではない # Cell#is_generate? にて参照される $unit_test = false # bool: unit test verification $kcode = nil # nil | String: Kanji code type "euc"|"sjis"|"none"|"utf8" $force_overwrite = false # bool: force overwrite all files if file contents not differ $no_banner = false # bool: not print banner $print_version = false # bool: print version $target = "tecs" # String: target name, ARGV[0] から再設定する("tecs" は仮のターゲット) $no_default_import_path = false # bool: no default import path $c_suffix = "c" # suffix for C progorams (for C++ source) $h_suffix = "h" # suffix for C progoram headers (for C++ source) if ENV["TECSGEN_DEFAULT_RAM"] rom_ram_defalult = "ram" else rom_ram_defalult = "rom" end if rom_ram_defalult == "rom" $rom = true # bool: ROM support : generate CB separately else $rom = false # bool: ROM support : generate CB separately end $b_cpp_specified = false if $cpp.nil? $cpp = "gcc -E -DTECSGEN" end if ENV["TECS_CPP"] $cpp = ENV["TECS_CPP"] $b_cpp_specified = true end if ENV["TECSPATH"] $tecspath = ENV["TECSPATH"] else $tecspath = "#{$tecsgen_base_path}/tecs" end # 文字コードの設定 $ENCODING_CDL = Encoding::EUC_JP # const: NONE には ASCII を対応させる $ENCODING_TECSGEN = Encoding::UTF_8 # const: end |
.is_absolute_path?(path) ⇒ Boolean
path は絶対パスか?
- path
-
String :
‘/’ または ‘$’ で始まる場合、絶対パスと判定する
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/tecsgen/core/tecsgen.rb', line 72 def self.is_absolute_path?(path) pa = path[0..0] pa2 = path[0..1] if pa == "/" || pa == "$" || pa2 =~ /[A-Za-z]:/ res = true else res = false end dbgPrint "is_absolute( #{path} ) = #{res} #{path[0]}\n" return res end |
.load_modules ⇒ Object
analyze_option
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# File 'lib/tecsgen.rb', line 442 def self.load_modules ### tecsgen モジュールのロード #### # -L でパス指定可能としたため、ここからロードを開始する # tecsgen バージョンファイルのロード # これを実行するまで tecsgen のバージョンを表示できない # このファイルを誤って読み込むと、異なるバージョン名を表示してしまう require "tecsgen/version" if $tecscde_version STDERR << "tecscde version #{$tecscde_version} (tecsgen version #{TECSGEN::VERSION}) #{TECSGEN::COPYRIGHT}\n" elsif !$no_banner || $print_version STDERR << "tecsgen version #{TECSGEN::VERSION} #{TECSGEN::COPYRIGHT}\n" end if $verbose STDERR << "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE} patchlevel #{RUBY_PATCHLEVEL}) [#{RUBY_PLATFORM}]\n" end if $print_version && ARGV.empty? && !$TECSFLOW exit end # 文字コード決定のため最初に読みこむ require "tecsgen/core/tecs_lang" unless $yydebug require "tecsgen/core/bnf.tab" else require "tecsgen/core/bnf-deb.tab" end # syntaxobj.rb には Node が定義されているので、早い段階で require require "tecsgen/core/syntaxobj" require "tecsgen/core/pluginModule" require "tecsgen/core/plugin" require "tecsgen/core/messages" require "tecsgen/core/types" require "tecsgen/core/value" require "tecsgen/core/componentobj" require "tecsgen/core/expression" require "tecsgen/core/optimize" require "tecsgen/core/tecsgen" require "tecsgen/core/generate" require "tecsgen/core/gen_xml" require "tecsgen/core/location" require "tecsgen/core/tool_info" require "tecsgen/core/tecsinfo" require "tecsgen/core/unjoin_plugin" require "tecsgen/plugin/CelltypePlugin" require "tecsgen/plugin/CompositePlugin" require "tecsgen/plugin/CellPlugin" require "tecsgen/plugin/SignaturePlugin" require "tecsgen/plugin/ThroughPlugin" require "tecsgen/plugin/DomainPlugin" require "tecsgen/plugin/MultiPlugin" # C 言語パーサ require "tecsgen/core/C_parser.tab" require "tecsgen/core/ctypes" if $unit_test exit 1 end end |
.new_cell_location(cell_location) ⇒ Object
—— manupulate location information ——–#
41 42 43 |
# File 'lib/tecsgen/core/location.rb', line 41 def self.new_cell_location(cell_location) @@current_tecsgen.new_cell_location cell_location end |
.new_join_location(join_location) ⇒ Object
53 54 55 |
# File 'lib/tecsgen/core/location.rb', line 53 def self.new_join_location(join_location) @@current_tecsgen.new_join_location join_location end |
.post_coded? ⇒ Boolean
finalize
450 451 452 |
# File 'lib/tecsgen/core/tecsgen.rb', line 450 def self.post_coded? @@b_post_coded end |
.set_default_config ⇒ Object
tecsgen のデフォルトを設定
85 86 87 |
# File 'lib/tecsgen/core/tecsgen.rb', line 85 def self.set_default_config Makefile.set_default_config end |
.setup ⇒ Object
load_modules
505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 |
# File 'lib/tecsgen.rb', line 505 def self.setup # $import_path に環境変数 $TECSGEN およびその直下を追加 if $no_default_import_path == false # $TECSGEN および、その直下のディレクトリをパスに追加 if $tecspath != "." TECSGEN.add_import_path $tecspath dir = nil begin Dir.foreach($tecspath){|f| if f != "." && f != ".." && File.directory?($tecspath + "/" + f) TECSGEN.add_import_path($tecspath + "/" + f) end } rescue # 無視 end end end # デフォルト設定 TECSGEN.set_default_config # $target の設定 $target = ARGV[0] pos = $target.rindex(/[:\\\/]/) if pos $target = $target[pos + 1..-1] # ディレクトリ区切りを除いた文字列 end pos = $target.rindex(/\./) if pos $target = $target[0..pos - 1] # 拡張子を取り除いた文字列 end # gen ディレクトリの作成 begin if !File.directory?($gen_base) Dir.mkdir($gen_base) end rescue print("Cannot mkdir #{$gen_base}. If the path has hierarchy, please create directory by manual.\n") exit 1 end end |
.subst_tecspath(path, b_global = false) ⇒ Object
$(TECSPATH) への置換
path::String : ENV[ ‘TECSPATH’ ] に一致する部分があれば、 “$(TECSPATH)” に置換 b_global::Bool : true なら gsub で置換。false なら sub で置換
55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/tecsgen/core/tecsgen.rb', line 55 def self.subst_tecspath(path, b_global = false) tp = $tecspath.dup tp.gsub!(/\\/, "\\\\\\\\") pattern = /#{tp}/ substr = "$(TECSPATH)" if b_global str = path.gsub(pattern, substr) else str = path.sub(pattern, substr) end dbgPrint "subst_tecspath #{path}, #{str}\n" return str end |
Instance Method Details
#finalize ⇒ Object
optimize_and_generate
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 |
# File 'lib/tecsgen/core/tecsgen.rb', line 416 def finalize dbgPrint("## Generating XML\n") # Region.gen_xml @root_namespace ## # Namespace.gen_XML @root_namespace $region_list.each{|region_path_str, val| if val == true Generator.warning("W9999 $1: not link root, -G ignored", region_path_str) end } # update する # APPFile で生成されたファイルは、もし変化があれば、ここで更新する # コード生成段階でエラーが発生すれば、更新しない # CFile で生成されたものは、更新されている if Generator.get_n_error == 0 begin AppFile.update rescue => evar Generator.error("G9999 Fail to update. (error occurred while renaming generated files)") print_exception(evar) end end print_report if Generator.get_n_error != 0 STDERR.print "error occurred while generating. some file can be corrupt in #{$gen_base}\n" exit 1 end open("#{$gen_base}/tecsgen.timestamp", "w"){|io| } end |
#get_cell_list ⇒ Object
TECSGEN#get_cell_list
555 556 557 |
# File 'lib/tecsgen.rb', line 555 def get_cell_list @cell_list end |
#get_cell_location_list ⇒ Object
49 50 51 |
# File 'lib/tecsgen/core/location.rb', line 49 def get_cell_location_list @cell_location_list end |
#get_celltype_list ⇒ Object
TECSGEN#get_celltype_list
550 551 552 |
# File 'lib/tecsgen.rb', line 550 def get_celltype_list @celltype_list end |
#get_join_location_list ⇒ Object
61 62 63 |
# File 'lib/tecsgen/core/location.rb', line 61 def get_join_location_list @join_location_list end |
#get_root_namespace ⇒ Object
559 560 561 |
# File 'lib/tecsgen.rb', line 559 def get_root_namespace @root_namespace end |
#new_cell_location(cell_location) ⇒ Object
45 46 47 |
# File 'lib/tecsgen/core/location.rb', line 45 def new_cell_location(cell_location) @cell_location_list << cell_location end |
#new_join_location(join_location) ⇒ Object
57 58 59 |
# File 'lib/tecsgen/core/location.rb', line 57 def new_join_location(join_location) @join_location_list << join_location end |
#optimize_and_generate ⇒ Object
semantics_analisys_2
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 |
# File 'lib/tecsgen/core/tecsgen.rb', line 322 def optimize_and_generate #### Region link root ごとにオプティマイズおよび生成 #### Region.get_link_roots.each {|region| n_cells = region.get_n_cells dbgPrint "#{region.get_name} has #{n_cells} cells\n" if $verbose print "=====================================\n" print "=== Region.path_str: #{region.get_namespace_path.get_path_str}\n" print "=====================================\n" else dbgPrint "Region.path_str: #{region.get_namespace_path.get_path_str}\n" end if $region_list.length > 0 if $region_list[region.get_namespace_path.get_path_str] $region_list[region.get_namespace_path.get_path_str] = false else next end end # セルが一つもなければ生成しない # セルの生成がない場合 if region.get_n_cells == 0 if $region_list.length > 0 Generator.warning("W9999 $1: specified to generate but has no cell", region.get_name) end if region != @root_namespace next end end $generating_region = region if Region.get_link_roots.length > 1 if region.get_name == "::" $gen = $gen_base else $gen = $gen_base + "/" + region.get_global_name.to_s begin if !File.directory?($gen) Dir.mkdir($gen) end rescue print("Cannot mkdir #{$gen}\n") exit 1 end end else $gen = $gen_base end dbgPrint("## Unset optimize variables\n") @root_namespace.reset_optimize # 最適化をリセットする if Generator.get_n_error == 0 # エラーが発生していたら、設定しない dbgPrint("## Set cell id\n") @root_namespace.set_cell_id_and_domain # セルの ID とドメイン情報を設定(linkunit 毎に0からつける) # エラーが発生していたら、最適化は実施しない if !$unopt dbgPrint("## Optimizing: Link Region=#{@root_namespace.get_name}\n") @root_namespace.optimize end end if $show_tree # エラーが発生していても表示(エラー発生時は最適化されていないので注意) print "##### show_tree LinkRegion=#{region.get_name} #####\n" @root_namespace.show_tree(0) print "##### END LinkRegion=#{region.get_name} #####\n\n" end # 構文解釈、意味解析でエラー発生していたら、コード生成をしない if Generator.get_n_error != 0 print_report exit 1 end #### コード生成 #### begin dbgPrint("## Generating: Link Region=#{@root_namespace.get_name}\n") @root_namespace.generate dbgPrint("## Generating Post: Link Region=#{@root_namespace.get_name}\n") @root_namespace.generate_post rescue # 通常ここへは来ない (generate, generate_post で処置される) Generator.error("G9999 fail to generate") end } end |
#run1 ⇒ Object
230 231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/tecsgen.rb', line 230 def run1 @@current_tecsgen = self syntax_analisys ARGV semantics_analisys_1 semantics_analisys_2 @celltype_list = Celltype.get_celltype_list @cell_list = Cell.get_cell_list @cell_list2 = Cell.get_cell_list2 @@current_tecsgen = nil end |
#run2 ⇒ Object
244 245 246 247 248 249 250 251 |
# File 'lib/tecsgen.rb', line 244 def run2 @@current_tecsgen = self optimize_and_generate finalize @@current_tecsgen = nil end |
#semantics_analisys_1 ⇒ Object
TECSGEN#semantics_analisys_1
semantics check. only cells here other objects (signature, celltype, typedef, etc ) are checked while syntax analisys
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 |
# File 'lib/tecsgen/core/tecsgen.rb', line 241 def semantics_analisys_1 #### 意味解析1 (post コードを除く) #### dbgPrint("## Creating reverse join \n") Cell.create_reverse_join DescriptorType.check_signature Signature.set_descriptor_list Celltype.check_dynamic_join # 0 set_definition_join は2回呼び出される(1回目) dbgPrint("## Checking all join\n") @root_namespace.set_definition_join # @root_namespace.set_require_join ### いったん見合わせ。重複エラーを見逃す # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施) #### post コードの生成と構文解析 #### @@b_post_coded = true # ポストコード生成開始後 true # 引数がなければ、プラグインのポストコードを出力しない if ARGV.length > 0 dbgPrint("## Generating Post Code\n") # プラグインのポストコードの出力と import tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl" file = nil begin file = CFile.open(tmp_file_name, "w") rescue Generator.error("G9999 fail to create #{tmp_file_name}") end if file # through プラグインのポストコード生成 PluginModule.gen_plugin_post_code file begin file.close rescue Generator.error("G9999 fail to close #{tmp_file_name}") end dbgPrint("## Import Post Code\n") Import.new(tmp_file_name.to_s) end end #### 意味解析1 (post コード) #### dbgPrint("## Creating reverse join (for post code) \n") Cell.create_reverse_join # Join の定義の設定とチェック # 0 # 前方参照対応 # 0 set_definition_join は2回呼び出される(2回目) post_code で生成された dbgPrint("## Checking all join (for cells generated by Post Code\n") @root_namespace.set_definition_join @root_namespace.set_max_entry_port_inner_cell dbgPrint("## Set require join\n") @root_namespace.set_require_join # mikan post の前にも # ポストコードで生成されたセルの require のjoin を生成 # mikan require で through が適用されて、ポストコードが必要となっても出力されない end |
#semantics_analisys_2 ⇒ Object
semantics_analisys_1
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 |
# File 'lib/tecsgen/core/tecsgen.rb', line 301 def semantics_analisys_2 #### 意味解析2 #### Cell.make_cell_list2 dbgPrint("## Set fixed join\n") Cell.create_reverse_require_join # create_reverse_require_join は set_detinition_join に埋め込むことができない # namespace に依存しない出現順で行う # mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要 dbgPrint("## Setting port reference count\n") @root_namespace.set_port_reference_count dbgPrint("## Checking all join\n") @root_namespace.check_join # mikan プラグインで生成されたコンポーネントの set_def_and_check_join dbgPrint("## Checking referenced but undefined cell\n") @root_namespace.check_ref_but_undef end |
#syntax_analisys(argv) ⇒ Object
—— TECSGEN CDL analyze and generate ——#
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/tecsgen/core/tecsgen.rb', line 219 def syntax_analisys(argv) # ルート namespace (region) を生成 @root_namespace = Region.new("::") #### 構文解析 (post コードを除く) #### # すべての cdl を import する argv.each{|f| dbgPrint("## Import: #{f}\n") TECSGEN.add_import_path(File.(File.dirname(f))) Import.new(f, false, false) } # すべての構文解釈が完了したことの報告 # 実際には、後からプラグインの生成する CDL のパースが行われる # エラー行数の決定方法の変更のために行う Generator.end_all_parse dbgPrint("## End all parse (except Post Code)\n") end |