Class: TECSGEN

Inherits:
Object show all
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(c) 2008-2018, TOPPERS project. All rights reserved."
LICENSE =
"TOPPERS License"
@@current_tecsgen =
nil
@@b_post_coded =

ポストコード生成開始後 true

false

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTECSGEN

—– 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.options {|parser|
    parser.banner = "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.options{|parser|
      puts parser.help
      exit 1
    }
  end
end

.get_argvObject



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_varObject

—– 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 :

‘/’ または ‘$’ で始まる場合、絶対パスと判定する

Returns:

  • (Boolean)


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_modulesObject

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

Returns:

  • (Boolean)


450
451
452
# File 'lib/tecsgen/core/tecsgen.rb', line 450

def self.post_coded?
  @@b_post_coded
end

.set_default_configObject

tecsgen のデフォルトを設定



85
86
87
# File 'lib/tecsgen/core/tecsgen.rb', line 85

def self.set_default_config
  Makefile.set_default_config
end

.setupObject

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

#finalizeObject

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_listObject

TECSGEN#get_cell_list



555
556
557
# File 'lib/tecsgen.rb', line 555

def get_cell_list
  @cell_list
end

#get_cell_location_listObject



49
50
51
# File 'lib/tecsgen/core/location.rb', line 49

def get_cell_location_list
  @cell_location_list
end

#get_celltype_listObject

TECSGEN#get_celltype_list



550
551
552
# File 'lib/tecsgen.rb', line 550

def get_celltype_list
  @celltype_list
end

#get_join_location_listObject



61
62
63
# File 'lib/tecsgen/core/location.rb', line 61

def get_join_location_list
  @join_location_list
end

#get_root_namespaceObject



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_generateObject

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

#run1Object



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

#run2Object



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_1Object

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_2Object

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.expand_path(File.dirname(f)))
    Import.new(f, false, false)
  }

  # すべての構文解釈が完了したことの報告
  #   実際には、後からプラグインの生成する CDL のパースが行われる
  #   エラー行数の決定方法の変更のために行う
  Generator.end_all_parse
  dbgPrint("## End all parse (except Post Code)\n")
end