Module: MrubyBridgeCelltypePluginModule

Included in:
MrubyBridgeCelltypePlugin, MrubyBridgeCompositePlugin
Defined in:
lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb

Overview

celltype プラグインの共通の親クラス

Constant Summary collapse

MrubyBridgePluginArgProc =

プラグイン引数名 => Proc

{
    "ignoreUnsigned" => Proc.new {|obj, rhs| obj.set_ignoreUnsigned rhs },
    "include_inner_cell" => Proc.new {|obj, rhs| obj.set_include_inner_cell rhs },
    "exclude_cell" => Proc.new {|obj, rhs| obj.set_exclude_cell rhs },
    "exclude_port" => Proc.new {|obj, rhs| obj.set_exclude_port rhs },
    "exclude_port_func" => Proc.new {|obj, rhs| obj.set_exclude_port_func rhs },
    "auto_exclude" => Proc.new {|obj, rhs| obj.set_auto_exclude rhs },
}
@@plugin_list =
[]
@@count =
1
@@b_gen_post_code_called =
false

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.gen_post_code(file) ⇒ Object

後ろの CDL コードを生成

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

file

File:



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 174

def self.gen_post_code(file)
  dbgPrint "#{self.name}: gen_post_code_body\n"

  if @@b_gen_post_code_called == false
    @@b_gen_post_code_called = true
    MrubyBridgeCellPlugin.gen_post_code_body file
  end

#    この段階で生成すると、同じポストコードで出力される mruby の初期化コードに反映されない

#    # MrubyBridgeCelltypePlugin の生成する generate 文は、
#    fn2 = "#{$gen}/tmp_MrubyBridgeCelltypePlugin_post.cdl"
#    f2 = File.open( fn2, "w" )
#    # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
#    dbgPrint "MrubyBridgeCelltypePlugin: gen_post_code\n"
#    f2.print "/* '#{self.name}' post code */\n"
#    @@plugin_list.each{ |plugin|
#      plugin.get_celltype.get_cell_list.each{ |cell|
#        # mikan option, region
#        f2.print <<EOT
# generate( MrubyBridgeCellPlugin, #{cell.get_namespace_path}, "" );
# EOT
#      }
#    }
#    f2.close
#    p Import
#    Import.new "#{fn2}"
end

Instance Method Details

#gen_cdl_file(file) ⇒ Object

CDL ファイルの生成

typedef, signature, celltype, cell のコードを生成
重複して生成してはならない
すでに生成されている場合は出力しないこと。
もしくは同名の import により、重複を避けること。
file

FILE 生成するファイル



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 138

def gen_cdl_file(file)
#   この段階で呼びだすと generate 文が呼び出される前のセルのみの出力となる

#    dbgPrint "MrubyBridgeCelltypePlugin: gen_cdl_file: #{@celltype.get_name}\n"
#    file.print <<EOT
# /* MrubyBridgeCelltypePlugin: celltype=#{@celltype.get_name}
# *
# *    cell's generate before celltype's generate
# */
#
# EOT
#    @celltype.get_cell_list.each { |cell|
#      @cell_list << cell
#      # mikan option, region
#      dbgPrint "MrubyBridgeCelltypePlugin: cell=#{cell.get_name}\n"
#      file.print <<EOT
# generate( MrubyBridgeCellPlugin, #{cell.get_namespace_path}, "" );
# EOT
#    }
end

#gen_factory(file) ⇒ Object

tCelltype_factory.h に挿入するコードを生成する

file 以外の他のファイルにファクトリコードを生成してもよい セルタイププラグインが指定されたセルタイプのみ呼び出される



162
163
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 162

def gen_factory(file)
end

#get_celltypeObject



165
166
167
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 165

def get_celltype
  @celltype
end

#initialize(celltype, option) ⇒ Object

celltype

Celltype セルタイプ(インスタンス)



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

def initialize(celltype, option)
  dbgPrint "#{self.class.name}: initialzie: #{celltype.get_name}\n"

  super
  @celltype = celltype
  @cell_list = []
  @include_inner_cell = false
  @exclude_cells = []
  @exclude_port = []
  @exclude_port_func = {}
  @b_ignoreUnsigned = false
  @b_auto_exclude = true # auto_exclude = true by default
  @@plugin_list << self

  @plugin_arg_check_proc_tab = MrubyBridgePluginArgProc
  @plugin_arg_str = CDLString.remove_dquote option
  parse_plugin_arg

  MrubyBridgeCellPlugin.set_gen_post_code_by_dependent
end

#new_cell(cell) ⇒ Object

新しいセル

cell

Cell セル

celltype プラグインを指定されたセルタイプのセルが生成された セルタイププラグインに対する新しいセルの報告 generate 文により呼び出された場合、それまでに定義された cell については、initialize のタイミングで呼び出される



84
85
86
87
88
89
90
91
92
93
94
95
96
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
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 84

def new_cell(cell)
  dbgPrint "MrubyBridgeCelltypePluginModule: new_cell: #{cell.get_name}\n"

  return if @cell_list.include? cell   # この行は、本来不要のはず
  if TECSGEN.post_coded?               # post_code 以降のセルは対象から外す
    cdl_info("I9999 MrubyBridgeCelltypePlugin: $1 is excluded because cell generated after post_coded", cell.get_name)
    return
  end

  # include_inner_cell option
  if cell.is_cloned? && @include_inner_cell == false
  #   p "#{cell.get_name} excluded"
    cdl_info("I9999 MrubyBridgeCelltypePlugin: inner cell $1 is excluded", cell.get_name)
    return
  # else
  #   p "#{cell.get_name} included"
  end

  # exclude_cell option
  if @exclude_cells.include?(cell.get_name)
    return
  end

  opt_str = "ignoreUnsigned=#{@b_ignoreUnsigned}, auto_exclude=#{@b_auto_exclude}"
  @exclude_port.each{|port|
    opt_str += ",exclude_port=#{port}"
  }
  @exclude_port_func.each{|port, funcs|
    funcs.each{|func|
      opt_str += ",exclude_port_func=#{port}.#{func}"
    }
  }

  # p "MrubyBridgeCelltypePlugin: opt_str=#{opt_str}"

  fn2 = "#{$gen}/tmp_MrubyBridgeCelltypePluginModule_#{@celltype.get_name}_#{@@count}.cdl"
  f2 = File.open(fn2, "w")
  f2.print <<EOT
/* MrubyBridgeCelltypePluginModule: celltype=#{@celltype.get_name} */
generate( MrubyBridgeCellPlugin, #{cell.get_namespace_path}, "#{opt_str}" );
EOT
  f2.close
  dbgPrint "MrubyBridgeCelltypePluginModule new_cell: Import #{fn2}\n"
  Import.new fn2.to_s
  @@count += 1
end

#set_auto_exclude(rhs) ⇒ Object

プラグイン引数 auto_exclude



273
274
275
276
277
278
279
280
281
282
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 273

def set_auto_exclude(rhs)
  # print "MrubyBridgeCellPlugin: auto_exclude=#{rhs}\n"
  if rhs == "false"
    @b_auto_exclude = false
  elsif rhs == "true"
    @b_auto_exclude = true # auto_exclude = true by default
  else
    cdl_warning("MRB9999 auto_exclude: unknown rhs value ignored. specify true or false")
  end
end

#set_exclude_cell(rhs) ⇒ Object



218
219
220
221
222
223
224
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 218

def set_exclude_cell(rhs)
  cells = rhs.split ","
  cells.each{|rhs_cell|
    rhs_cell.gsub!(/\s/, "")
    @exclude_cells << rhs_cell.to_sym
  }
end

#set_exclude_port(rhs) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 226

def set_exclude_port(rhs)
  ports = rhs.split ","
  ct = @cell.get_celltype
  return if ct.nil? # error case
  ports.each{|rhs_port|
    obj = ct.find(rhs_port.to_sym)
    if (!obj.instance_of? Port) || obj.get_port_type != :ENTRY
      cdl_error("MRB9999 exclude_port '$1' not found or not entry in celltype '$2'", rhs_port, ct.get_name)
    else
      # print "MRBBridgeCellPlugin: exclude #{rhs_port}\n"
      @exclude_port << rhs_port
    end
  }
end

#set_exclude_port_func(rhs) ⇒ Object

プラグイン引数 exclude_port_func



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

def set_exclude_port_func(rhs)
  port_funcs = rhs.split ","
  ct = @celltype
  return if ct.nil? # error case
  port_funcs.each{|rhs_port_func|
    port_func = rhs_port_func.split(".")
    if port_func.length != 2
      cdl_error("MRB9999 exclude_port_func: '$1' not in 'port.func' form", rhs_port_func)
    end
    obj = ct.find(port_func[0].to_sym)
    if (!obj.instance_of? Port) || obj.get_port_type != :ENTRY
      cdl_error("MRB9999 exclude_port_func: port '$1' not found in celltype '$2'", rhs_port_func, ct.get_name)
    else
      signature = obj.get_signature
      next if signature.nil? # error case
      if signature.get_function_head port_func[1].to_sym
        # print "MRBBridgeCellPlugin: #{port_func[0]}.#{port_func[1]} exclude\n"
        if @exclude_port_func[port_func[0]]
          @exclude_port_func[port_func[0]] <<  port_func[1]
        else
          @exclude_port_func[port_func[0]] = [port_func[1]]
        end
      else
        cdl_error("MRB9999 include_port_func: func '$1' not found in port '$2' celltype $3",
                   port_func[1], port_func[0], ct.get_name)
      end
    end
  }
end

#set_ignoreUnsigned(rhs) ⇒ Object

プラグイン引数 ignoreUnsigned



206
207
208
209
210
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 206

def set_ignoreUnsigned(rhs)
  if rhs == "true" || rhs.nil?
    @b_ignoreUnsigned = true
  end
end

#set_include_inner_cell(rhs) ⇒ Object



212
213
214
215
216
# File 'lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb', line 212

def set_include_inner_cell(rhs)
  if rhs == "true" || rhs.nil?
    @include_inner_cell = true
  end
end