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

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

文字コードを設定

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