source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2KernelObjectPlugin.rb@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 14.6 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2008-2012 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52#++
53
54# Regionクラスにメソッドを追加
55=begin
56class Region
57 def get_params
58 return @region_type_param
59 end
60
61 def get_param
62 return @region_type_param[0]
63 end
64
65 def is_root
66 return self == @@root_namespace
67 end
68end
69=end
70
71# Cellクラスにインスタンス変数とメソッドを追加
72=begin
73class Cell
74 def set_referenced_region( region )
75 if @referenced_regions.nil?
76 @referenced_regions = Array.new
77 end
78 if !@referenced_regions.include?(region)
79 @referenced_regions << region
80 end
81 end
82
83 def get_referenced_regions
84 return @referenced_regions
85 end
86
87 # set_referenced_cellにしたほうがよい
88 # def set_referenced_region( region, port_name )
89 def set_referenced_cell( cell, port_name )
90 if @referenced_cells.nil?
91 @referenced_cells = Hash.new
92 end
93 if !@referenced_cells.include?(port_name)
94 @referenced_cells[port_name] = Array.new
95 end
96 if !@referenced_cells[port_name].include?(cell)
97 @referenced_cells[port_name] << cell
98 end
99
100 region = cell.get_region
101 puts "***** set_referenced_regions *****"
102 puts "region=#{region.get_name}, port=#{port_name}(#{port_name.class})"
103 if @referenced_regions.nil?
104 @referenced_regions = Hash.new
105 end
106 if !@referenced_regions.include?(port_name)
107 @referenced_regions[port_name] = Array.new
108 end
109 if !@referenced_regions[port_name].include?(region)
110 @referenced_regions[port_name] << region
111 end
112 puts "#{@referenced_regions[port_name]}"
113 end
114
115 def get_referenced_cells( port_name )
116 if !@referenced_cells.nil? && @referenced_cells.include?(port_name)
117 return @referenced_cells[port_name]
118 else
119 return nil
120 end
121 end
122
123 def get_referenced_regions( port_name )
124 if !@referenced_regions.nil? && @referenced_regions.include?(port_name)
125 return @referenced_regions[port_name]
126 else
127 return nil
128 end
129 end
130
131 def self.get_cell_list
132 return @@cell_list
133 end
134
135 def self.get_cell_list2
136 return @@cell_list2
137 end
138end
139=end
140
141#== celltype プラグインのå…
142±é€šã®è¦ªã‚¯ãƒ©ã‚¹
143class HRP2KernelObjectPlugin < CelltypePlugin
144 # @@obj_hash = {}
145
146 #@celltype:: Celltype
147 #@option:: String :オプション文字列
148 def initialize( celltype, option )
149 super
150 # それぞれのカーネルオブジェクトを解析対象セルタイプに追加
151 HRP2KernelObjectPlugin.set_celltype(celltype)
152 end
153
154 #=== HRP2KernelObjectPlugin#print_cfg_cre
155 # 各種カーネルオブジェクトのCRE_*の出力
156 # file:: FILE: 出力å…
157ˆãƒ•ã‚¡ã‚¤ãƒ«
158 # val :: string: カーネルオブジェクトの属性の解析結果
159 # tab :: string: インデント用のtab
160 def print_cfg_cre(file, cell, val, tab)
161 raise "called virtual method print_cfg_cre in #{@celltype.get_name} plugin"
162 end
163
164 #=== HRP2KernelObjectPlugin#print_cfg_sac
165 # 各種カーネルオブジェクトのSAC_*の出力
166 # file:: FILE: 出力å…
167ˆãƒ•ã‚¡ã‚¤ãƒ«
168 # val :: string: カーネルオブジェクトの属性の解析結果
169 # acv :: string: アクセスベクタ
170 def print_cfg_sac(file, val, acv)
171 raise "called virtual method print_cfg_sac in #{@celltype.get_name} plugin"
172 end
173
174 #=== HRP2KernelObjectPlugin#get_entry_ports_name_list
175 # カーネルオブジェクトの各種アクセスの種別の受け口名を取得
176 def get_entry_ports_name_list()
177 raise "called virtual method get_entry_ports_name_list in #{@celltype.get_name} plugin"
178 end
179
180 def string_cfg_cre(cell, val)
181 raise "called virtual method string_cfg_cre in #{@celltype.get_name} plugin"
182 end
183
184 def gen_factory file
185 puts "===== begin #{@celltype.get_name.to_s} plugin ====="
186
187 # 対象となるすべてのセルについて、受け口に結合されている
188 # セルの所属ドメインを解析
189 if !HRP2KernelObjectPlugin.isChecked()
190 HRP2KernelObjectPlugin.check_referenced_cells()
191 else
192 puts "***** already checked"
193 end
194
195 # 追記するために AppFile を使う(文字コード変換されない)
196 file2 = AppFile.open( "#{$gen}/tecsgen.cfg" )
197 file2.print "\n/* Generated by #{self.class.name} */\n\n"
198
199 @celltype.get_cell_list.each { |cell|
200 if cell.is_generate?
201 puts "===== begin check my domain #{cell.get_name} ====="
202 # attrの値をハッシュにå…
203¥ã‚Œã‚‹
204 val = {}
205 @celltype.get_attribute_list.each{ |a|
206 p a.get_name
207 if a.get_type.kind_of?( ArrayType )
208 val[a.get_name] = []
209 if j = cell.get_join_list.get_item(a.get_name)
210 # セル生成時に初期化する場合
211 j.get_rhs.each { |elem|
212 val[a.get_name] << elem.to_s
213 }
214 elsif i = a.get_initializer
215 # セルタイプの初期化値を使う場合
216 i.each { |elem|
217 val[a.get_name] << elem.to_s
218 }
219 else
220 raise "attribute is not initialized"
221 end
222 else
223 if j = cell.get_join_list.get_item(a.get_name)
224 # セル生成時に初期化する場合
225 val[a.get_name] = j.get_rhs.to_s
226 elsif i = a.get_initializer
227 # セルタイプの初期化値を使う場合
228 val[a.get_name] = i.to_s
229 else
230 raise "attribute is not initialized"
231 end
232 end
233 }
234 # generate.rbを参考に
235 # $id$を置換
236 if val[:id].nil? != true
237 puts val[:id]
238 val[:id] = val[:id].gsub( /(^|[^\$])\$id\$/, "\\1#{@celltype.get_name.to_s}_#{cell.get_name.to_s}" )
239 end
240 # $cbp$の代わり
241 index = cell.get_id - @celltype.get_id_base
242 cell_CB_name = "#{@celltype.get_global_name}_CB_tab[#{index}]"
243 cell_domain_root = cell.get_region.get_domain_root
244 cell_domain_type = cell.get_region.get_domain_root.get_domain_type
245
246 # CRE_XXX/DEF_XXXの生成
247 if cell_domain_type.get_option.to_s != "OutOfDomain"
248 # 保護ドメインに属する場合
249 if !HRP2KernelObjectPlugin.include_region(cell_domain_root.get_name.to_s)
250 # その保護ドメインの.cfgが生成されていない場合
251 HRP2KernelObjectPlugin.set_region_list(cell_domain_root.get_name.to_s)
252 puts "~~~~~ #{cell_domain_root.get_name.to_s} is registered!"
253
254 # if cell.get_region.get_param == :KERNEL_DOMAIN
255 if cell_domain_type.get_option.to_s == "trusted"
256 # file2.print "#{cell.get_region.get_name.to_s}{\n"
257 file2.print "KERNEL_DOMAIN{\n"
258 else
259 file2.print "DOMAIN(#{cell_domain_root.get_name.to_s}){\n"
260 end
261 file2.puts "\tINCLUDE(\"#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg\");"
262 file2.puts "}\n"
263 else
264 print "~~~~~ #{cell.get_region.get_name.to_s} is included in"
265 p @@region_list
266 end
267 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell_domain_root.get_name.to_s}.cfg" )
268 print_cfg_cre(file3, cell, val,"")
269 file3.close
270 else
271 # 無所属の場合
272 puts "~~~~~ #{cell_domain_root.get_name.to_s} is OutOfDomain"
273 print_cfg_cre(file2, cell, val, "")
274 end
275
276 puts "===== end check my domain #{cell.get_name} ====="
277 # SAC_XXXの生成
278 puts "===== begin check regions #{cell.get_name} ====="
279 p val[:accessPattern]
280 p val[:accessPattern].class
281
282 #ep = [ :eTaskActivate, :eTaskControl, :eTaskManage, :eTaskRefer ]
283 #各カーネルオブジェクトの受け口名を取得
284 # ep = get_entry_ports_name_list()
285 i = 0
286 acv = []
287 # アクセス許可ベクタの生成
288 val[:accessPattern].each { |acptnx|
289 # アクセス許可パターンの生成
290 if acptnx != "OMIT"
291 acv << acptnx
292 p acv[i]
293 elsif cell_domain_type.get_option.to_s == "trusted"
294 acv << "TACP_KERNEL"
295 p acv[i]
296 elsif cell_domain_type.get_option.to_s != "OutOfDomain"
297 acv << "TACP(#{cell_domain_root.get_name.to_s})"
298 else
299 acv << "TACP_SHARED"
300 end
301
302 i += 1
303 }
304
305 print "acv = "
306 p acv
307
308 #各種SACの生成
309 domainOption = cell_domain_type.get_option
310 # if cell.get_region.get_region_type == :DOMAIN
311 if domainOption != "OutOfDomain"
312 # 保護ドメインに属する場合
313 file3 = AppFile.open( "#{$gen}/tecsgen_#{cell.get_region.get_name.to_s}.cfg" )
314 print_cfg_sac(file3, val, acv)
315 file3.close
316 else
317 # 無所属の場合
318 print_cfg_sac(file2, val, acv)
319 end
320
321 puts "===== end check regions #{cell.get_name} ====="
322 end
323 }
324
325 puts "===== end #{@celltype.get_name.to_s} plugin ====="
326 file2.close
327 end
328
329 # カーネルオブジェクトセルタイプの管理
330 # HRP2KernelObjectPluginクラスに対してメソッド呼出しを行うことを想定
331 @@checked = false
332 @@celltype_list = []
333 @@region_list = []
334
335 def self.isChecked()
336 return @@checked
337 end
338
339 def self.check_referenced_cells()
340 puts "===== begin check registered celltype ====="
341 self.get_celltype_list.each { |ct|
342 p ct.get_name.to_s
343 }
344 puts "===== end check registered celltype ====="
345
346=begin
347 Cell.get_cell_list2.each { |cell|
348 cell.get_celltype.get_port_list.each{ |p|
349 next if p.get_port_type != :CALL
350 j = cell.get_join_list.get_item(p.get_name)
351 printf "===== check call port : "
352 p p.get_name.to_s
353 next if j.nil? # 未結合の場合
354 if @@celltype_list.include?(j.get_celltype)
355 # j.get_cell.set_referenced_region(cell.get_region)
356 # j.get_cell.set_referenced_region(cell.get_region, j.get_port_name)
357 j.get_cell.set_referenced_cell(cell, j.get_port_name)
358 printf "===== check joined rhs cell : "
359 p j.get_cell.get_name.to_s
360 printf "===== check joined rhs port_name : "
361 p j.get_port_name
362 end
363 }
364 }
365=end
366 @@checked = true
367 end
368
369 def self.set_celltype( celltype )
370 @@celltype_list << celltype
371 end
372
373 def self.get_celltype_list
374 return @@celltype_list
375 end
376
377 def self.set_region_list( region )
378 @@region_list << region
379 end
380
381 def self.include_region( region )
382 return @@region_list.include?(region)
383 end
384
385 def self.include_celltype?( celltype )
386 return @@celltype_list.include?(celltype)
387 end
388
389end
390
Note: See TracBrowser for help on using the repository browser.