Class: NotifierPlugin::AdapterGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/tecsgen/plugin/NotifierPlugin.rb

Defined Under Namespace

Classes: EntryPort, EntryProperty

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(celltype_name, prefix) ⇒ AdapterGenerator

Returns a new instance of AdapterGenerator.

Parameters:

  • celltype_name (String)

    ハンドラ関数のセルタイプ.

  • prefix (String)

    名前衝突を防ぐためのプレフィックス.



317
318
319
320
321
322
323
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 317

def initialize(celltype_name, prefix)
  @celltype_name = celltype_name
  @prefix = prefix

  # Hash<Port, EntryPort>
  @entry_ports = {}
end

Instance Attribute Details

#header_fileObject (readonly)



313
314
315
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 313

def header_file
  @header_file
end

#source_fileObject (readonly)



310
311
312
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 310

def source_file
  @source_file
end

Instance Method Details

#finishObject

AdapterGenerator#finish===

各受け口に対し,アダプタ関数を生成する.



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
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 340

def finish
  @source_file = AppFile.open("#{$gen}/#{@celltype_name}.c")
      @source_file.print "\n/* Generated by #{self.class.name} */\n\n"
      @source_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"
      @source_file.print "\#include \"#{@celltype_name}_tecsgen.h\"\n\n"

  @header_file = AppFile.open("#{$gen}/#{@celltype_name}.h")
      @header_file.print "\n/* Generated by #{self.class.name} */\n\n"

  # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
  # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
  # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
  # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
  # という少し特殊なヘッダーガードを用いる.
  header_guard = "#{@celltype_name}_H_#{@prefix}"

      @header_file.print "\#ifndef #{header_guard}\n"
      @header_file.print "\#define #{header_guard}\n\n"

      # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
      # のセルCBの定義が必要な場合がある.
      @header_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"

  # 結合先のセルタイプの定義は,自分のセルのtecsgen.hよりも先に
  # 読み込まなければならないが,このプラグインが複数実行されると,
  # 順序が崩れてしまう.そこで,結合先のセルタイプの定義はもう一つの
  # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
  aux_header_file = AppFile.open("#{$gen}/#{@celltype_name}_aux.h")
      aux_header_file.print "\n/* Generated by #{self.class.name} */\n\n"

  aux_header_guard = "#{@celltype_name}_AUX_H_#{@prefix}"

      aux_header_file.print "\#ifndef #{aux_header_guard}\n"
      aux_header_file.print "\#define #{aux_header_guard}\n\n"

  cb_type_only_guard = "#{@celltype_name}_AUX_H_#{@prefix}_CB_TYPE_ONLY"

  # 結合先のセルタイプの定義を読み込む
  aux_header_file.print "#ifndef TOPPERS_CB_TYPE_ONLY\n"
    aux_header_file.print "#define TOPPERS_CB_TYPE_ONLY\n"
    aux_header_file.print "#define #{cb_type_only_guard}\n"
  aux_header_file.print "#endif\n"
  @entry_ports.values.map {|ep|
    ep.port.get_celltype
  }.uniq.each {|ct|
    hname = "#{ct.get_global_name}_tecsgen.#{$h_suffix}"
    aux_header_file.print "\#include \"#{hname}\"\n"
  }
  aux_header_file.print "#ifdef #{cb_type_only_guard}\n"
    aux_header_file.print "#undef #{cb_type_only_guard}\n"
    aux_header_file.print "#undef TOPPERS_CB_TYPE_ONLY\n"
  aux_header_file.print "#endif\n\n"

  aux_header_file.print "\#endif\n"
  aux_header_file.close

  @entry_ports.each {|port, entry_port|
    entry_port.generate self
  }

      @header_file.print "\#endif\n"

  @source_file.close
  @header_file.close
end

#make_adapter_handle(join) ⇒ Array

AdapterGenerator#make_adapter_handle===

指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.

Returns:

  • (Array)

    アダプタ関数ハンドル.



328
329
330
331
332
333
334
335
336
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 328

def make_adapter_handle(join)
  entry_port = @entry_ports[join.get_rhs_port]
  unless entry_port
    entry_port = EntryPort.new(join.get_rhs_port,
      "#{@celltype_name}_#{@prefix}")
    @entry_ports[join.get_rhs_port] = entry_port
  end
  return entry_port.make_adapter_handle(join)
end