source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/plugin/HRP2KernelObjectPlugin.rb@ 359

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

SDカードの挿抜を検知するよう更新

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