Class: TECS2CBridgePlugin

Inherits:
SignaturePlugin show all
Defined in:
lib/tecsgen/plugin/TECS2CBridgePlugin.rb

Overview

TECS => C 呼び出しプラグイン

Constant Summary collapse

@@signature_list =
@option

String ‘“’, ‘”’ で囲まれた文字列

{ }

Constants inherited from Plugin

Plugin::PluginArgProc

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Plugin

#cdl_error, #check_plugin_arg, #gen_ep_func?, #gen_preamble, #new_cell, #parse_plugin_arg, #print_msg, #set_locale, #set_silent

Methods inherited from Node

#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str, #set_locale

Constructor Details

#initialize(signature, option) ⇒ TECS2CBridgePlugin

signature

Signature シグニチャ(インスタンス)



47
48
49
50
51
52
53
54
55
# File 'lib/tecsgen/plugin/TECS2CBridgePlugin.rb', line 47

def initialize(signature, option)
  super

  @signature = signature
  @header_name = "#{$gen}/#{@signature.get_global_name}.#{$h_suffix}"
  @celltype_name = :"t#{@signature.get_global_name}"

  parse_plugin_arg
end

Class Method Details

.gen_post_code(file) ⇒ Object

後ろのコードを生成

プラグインの後ろのコードを生成

file

File:



80
81
82
83
# File 'lib/tecsgen/plugin/TECS2CBridgePlugin.rb', line 80

def self.gen_post_code(file)
  # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
  # file.print "/* '#{self.class.name}' post code */\n"
end

Instance Method Details

#gen_cdl_file(file) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/tecsgen/plugin/TECS2CBridgePlugin.rb', line 57

def gen_cdl_file(file)
  if @@signature_list[@signature.get_global_name]
    @@signature_list[@signature.get_global_name] << self
    cdl_warning("T2CW001 signature '$1' duplicate. ignored current one", @signature.get_namespace_path)
    return
  end
  @@signature_list[@signature.get_global_name] = [self]

  print_msg "  TECS2CBridgePlugin: [celltype] TECS2C::#{@celltype_name}. Create cell then join to entry port 'eEntry' from the caller cell\n"
  file.print <<EOT
namespace nTECS2C{
[singleton]
celltype #{@celltype_name} {
  [inline]
  entry #{@signature.get_namespace_path} eEnt;
};
};
EOT
end

#gen_ep_func_body(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params) ⇒ Object

受け口関数の本体(C言語)を生成する

通常であれば、ジェネレータは受け口関数のテンプレートを生成する
プラグインの場合、変更する必要のないセルタイプコードを生成する
file

FILE 出力先ファイル

b_singleton

bool true if singleton

ct_name

Symbol

global_ct_name

string

sig_name

string

ep_name

string

func_name

string

func_global_name

string

func_type

class derived from Type



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/tecsgen/plugin/TECS2CBridgePlugin.rb', line 97

def gen_ep_func_body(file, b_singleton, ct_name, global_ct_name, sig_name, ep_name, func_name, func_global_name, func_type, params)
  ret_type = func_type.get_type
  b_ret_void = ret_type.is_void?

  if !b_ret_void
    file.print("  #{ret_type.get_type_str}  retval;\n")
  end

  if !b_singleton

    file.print <<EOT
#{ct_name}_CB    *p_cellcb;
if( VALID_IDX( idx ) ){
  p_cellcb = #{global_ct_name}_GET_CELLCB(idx);
}else{
   /* エラー処理コードをここに記述 */
}

EOT
  end

  # p "celltype_name, sig_name, func_name, func_global_name"
  # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"

  if !b_ret_void
    file.print("  retval = ")
  else
    file.print("  ")
  end

  file.print("#{func_name}(")

  delim = ""
  params.each{|param|
    file.printf("#{delim} #{param.get_name}")
    delim = ","
  }

  file.print(" );\n")

  if !b_ret_void
    file.print("  return retval;\n")
  end
end

#gen_postamble(file, b_singleton, ct_name, global_name) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/tecsgen/plugin/TECS2CBridgePlugin.rb', line 142

def gen_postamble(file, b_singleton, ct_name, global_name)
  # generate header file here, NOT postamble
  file2 = CFile.open(@header_name, "w")
  file2.print <<EOT
/*
 * This file was generated by TECS2CBridgePlugin and has prototype
 * decalarations of functions in signature '#{@signature.get_namespace_path}'
 */

#include "global_tecsgen.#{$h_suffix}"

EOT
  @signature.get_function_head_array.each {|f|
    decl = f.get_declarator
    func_type = decl.get_type
    params = func_type.get_paramlist.get_items
    func_name = decl.get_name

    ret_type = func_type.get_type

    # p "celltype_name, sig_name, func_name, func_global_name"
    # p "#{ct_name}, #{sig_name}, #{func_name}, #{func_global_name}"

    file2.print("#{ret_type.get_type_str}  #{func_name}(")

    delim = ""
    params.each{|param|
      file2.printf("#{delim} #{param.get_name}")
      delim = ","
    }

    file2.print(" )#{ret_type.get_type_str_post};\n")
  }

    file2.close
end