source: EcnlProtoTool/trunk/asp3_dcre/cfg/pass2.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.3 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TOPPERS Configurator by Ruby
4#
5# Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
6# Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
7# Graduate School of Information Science, Nagoya Univ., JAPAN
8#
9# 上記著作権者
10は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12# 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16# スコード中に含まれていること.
17# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18# 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21# 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23# の無保証規定を掲載すること.
24# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25# 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27# と.
28# (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31# 作権表示,この利用条件および下記の無保証規定を掲載すること.
32# (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35# 報告すること.
36# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37# 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41# 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43# å…
44è²¬ã™ã‚‹ã“と.
45#
46# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51# の責任を負わない.
52#
53# $Id: pass2.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
54#
55
56#
57# パス2の処理
58#
59
60#
61# パス1の生成物の読み込み
62#
63module Cfg1Out
64 #
65 # Sレコードファイルからシンボルの値を取り出す
66 #
67 def self.GetSymbolValue(symbol, size, signed)
68 if @symbolAddress.has_key?(symbol)
69 return(@cfg1SRec.get_value(@symbolAddress[symbol], size, signed))
70 else
71 return(nil)
72 end
73 end
74
75 #
76 # パス1の生成物の読み込み(メインの処理)
77 #
78 def self.Read
79 # cfg1_out.symsの読み込み
80 @symbolAddress = ReadSymbolFile(CFG1_OUT_SYMS)
81
82 # cfg1_out.srecの読み込み
83 begin
84 @cfg1SRec = SRecord.new(CFG1_OUT_SREC)
85 rescue Errno::ENOENT, Errno::EACCES => ex
86 abort(ex.message)
87 end
88
89 # マジックナンバーの取得
90 if @symbolAddress.has_key?(CFG1_MAGIC_NUM)
91 $asmLabel = ""
92 $cfg1_prefix = CFG1_PREFIX
93 elsif @symbolAddress.has_key?("_" + CFG1_MAGIC_NUM)
94 $asmLabel = "_"
95 $cfg1_prefix = "_" + CFG1_PREFIX
96 else
97 error_exit("`#{CFG1_MAGIC_NUM}' is not found in `#{CFG1_OUT_SYMS}'")
98 end
99
100 magicNumberData = @cfg1SRec.get_data(@symbolAddress \
101 [$asmLabel + CFG1_MAGIC_NUM], 4)
102 if (magicNumberData == "12345678")
103 $endianLittle = false
104 elsif (magicNumberData == "78563412")
105 $endianLittle = true
106 else
107 error_exit("`#{CFG1_MAGIC_NUM}' is invalid in `#{CFG1_OUT_SREC}'")
108 end
109
110 # 固定出力した変数の取得
111 $sizeOfSigned = GetSymbolValue($asmLabel + CFG1_SIZEOF_SIGNED, 4, false)
112
113 # 値取得シンボルの取得
114 $symbolValueTable.each do |symbolName, symbolData|
115 symbol = $cfg1_prefix + symbolName
116 if symbolData.has_key?(:BOOL)
117 value = GetSymbolValue(symbol, $sizeOfSigned, true)
118 if !value.nil?
119 # C言語の真偽値をRubyの真偽値に変換して取り込む
120 symbolData[:VALUE] = (value != 0)
121 end
122 else
123 value = GetSymbolValue(symbol, $sizeOfSigned, \
124 symbolData.has_key?(:SIGNED))
125 if !value.nil?
126 symbolData[:VALUE] = value
127 end
128 end
129 end
130
131 #
132 # ハッシュの初期化
133 #
134 $cfgData = {}
135 @objidValues = {}
136 $apiDefinition.each do |apiName, apiDef|
137 if apiDef.has_key?(:API)
138 if !$cfgData.has_key?(apiDef[:API].to_sym)
139 $cfgData[apiDef[:API].to_sym] = {}
140 end
141 end
142 apiDef[:PARAM].each do |apiParam|
143 if apiParam.has_key?(:NAME) && apiParam.has_key?(:ID_DEF)
144 @objidValues[apiParam[:NAME]] = {}
145 end
146 end
147 end
148
149 #
150 # ドメイン生成データをコンフィギュレーションデータ($cfgData)に格納
151 #
152 $cfgData[:CRE_DOM] = {}
153 $domainId.each do |domainName, domainVal|
154 domid = NumStr.new(domainVal, domainName)
155 $cfgData[:CRE_DOM][domainVal] = { :domid => domid }
156 end
157
158 ReadPhase(nil)
159 end
160
161 #
162 # パラメータの値を取り出す
163 #
164 def self.GetParamValue(paramName, param, apiIndex, index, apiParam, cfgInfo)
165 if apiParam.has_key?(:ID_DEF) # オブジェクト識別名(定義)
166 value = @objidValues[paramName][param]
167 elsif apiParam.has_key?(:ID_REF) # オブジェクト識別名(参ç…
168§ï¼‰
169 if @objidValues[paramName].has_key?(param)
170 value = @objidValues[paramName][param]
171 else
172 error("#{apiDef.has_key?(:KEYPAR) ? "E_NOEXS" : "E_ID"}: " \
173 "`#{param}' in #{cfgInfo[:APINAME]} is not defined", \
174 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
175 value = nil
176 end
177 elsif apiParam.has_key?(:EXPTYPE) # 整数定数式パラメータ
178 if apiIndex.nil?
179 if param.is_a?(NumStr)
180 return(param)
181 else
182 return(NumStr.new(param))
183 end
184 else
185 symbol = "#{$cfg1_prefix}valueof_#{paramName}_#{apiIndex}#{index}"
186 value = GetSymbolValue(symbol, $sizeOfSigned, \
187 apiParam.has_key?(:SIGNED))
188 end
189 else # 一般定数式/文字列パラメータ
190 return(param)
191 end
192 return(NumStr.new(value, param))
193 end
194
195 #
196 # 指定したフェーズのためのパス1の生成物の読み込み
197 #
198 def self.ReadPhase(phase)
199 #
200 # オブジェクトIDの割当て
201 #
202 # 割り当てたオブジェクトIDは,@objidValuesに保持する.@objidValuesは,
203 # 2重のハッシュ(ハッシュのハッシュ)である.
204 #
205 # å…
206·ä½“的には,@objidValuesは,オブジェクトIDのパラメータ名(例えば,セ
207 # マフォIDであれば"semid".これを保持する変数名は,objidParamNameとす
208 # る)をキーとし,そのオブジェクトIDの割当て表(これを保持する変数名
209 # は,objidListとする)を値とするハッシュである.オブジェクトIDの割当
210 # て表は,オブジェクト名(これを保持する変数名は,objNameとする)をキー
211 # とし,そのID番号(これを保持する変数名は,objidNumberとする)を値と
212 # するハッシュである.
213 #
214 # 例えば,セマフォSEM1のID番号が1の場合には,次のように設定される.
215 # @objidValues["semid"]["SEM1"] == 1
216 #
217
218 # ID番号割り当ての前処理
219 objidParamNameList = []
220 $cfgFileInfo.each do |cfgInfo|
221 # プリプロセッサディレクティブは読み飛ばす
222 next if cfgInfo.has_key?(:DIRECTIVE)
223
224 apiDef = $apiDefinition[cfgInfo[:APINAME]]
225 # 異なるフェーズの静的APIは読み飛ばす
226 next if apiDef[:PHASE] != phase
227
228 apiIndex = cfgInfo[:INDEX]
229 if !apiIndex.nil?
230 # シンボルファイルに静的APIのインデックスが存在しなければ読み飛
231 # ばす(ifdef等で消えた静的API)
232 symbol = "#{$cfg1_prefix}static_api_#{apiIndex}"
233 next unless @symbolAddress.has_key?(symbol)
234 end
235
236 apiDef[:PARAM].each do |apiParam|
237 if apiParam.has_key?(:NAME) && apiParam.has_key?(:ID_DEF)
238 objidParamName = apiParam[:NAME]
239 objName = cfgInfo[objidParamName]
240 if $inputObjid.has_key?(objName)
241 # ID番号å…
242¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã«å®šç¾©ã•ã‚Œã¦ã„た場合
243 @objidValues[objidParamName][objName] = $inputObjid[objName]
244 else
245 @objidValues[objidParamName][objName] = nil
246 end
247 objidParamNameList.push(objidParamName)
248 end
249 end
250 end
251
252 # ID番号の割当て処理
253 objidParamNameList.each do |objidParamName|
254 objidList = @objidValues[objidParamName]
255
256 # 未使用のID番号のリスト(使用したものから消していく)
257 unusedObjidList = (1.upto(objidList.keys.size)).to_a
258
259 # 割り当て済みのID番号の処理
260 objidList.each do |objName, objidNumber|
261 if $inputObjid.has_key?(objName)
262 objidIndex = unusedObjidList.index($inputObjid[objName])
263 if objidIndex.nil?
264 # ID番号å…
265¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã§æŒ‡å®šã•ã‚ŒãŸå€¤ãŒä¸æ­£
266 error_exit("value of `#{objName}' in ID input file is illegal")
267 else
268 # 未使用のID番号のリストから削除
269 unusedObjidList.delete_at(objidIndex)
270 end
271 end
272 end
273
274 # ID番号の割当て
275 objidList.each do |objName, objidNumber|
276 if objidList[objName].nil?
277 # 以下で,@objidValuesを書き換えている
278 objidList[objName] = unusedObjidList.shift
279 end
280 end
281 end
282
283 #
284 # 静的APIデータをコンフィギュレーションデータ($cfgData)に格納
285 #
286 $cfgFileInfo.each do |cfgInfo|
287 # プリプロセッサディレクティブは読み飛ばす
288 next if cfgInfo.has_key?(:DIRECTIVE)
289
290 apiDef = $apiDefinition[cfgInfo[:APINAME]]
291 # 異なるフェーズの静的APIは読み飛ばす
292 next if apiDef[:PHASE] != phase
293
294 apiSym = apiDef[:API].to_sym
295 apiIndex = cfgInfo[:INDEX]
296 if !apiIndex.nil?
297 # シンボルファイルに静的APIのインデックスが存在しなければ読み飛
298 # ばす(ifdef等で消えた静的API)
299 symbol = "#{$cfg1_prefix}static_api_#{apiIndex}"
300 next unless @symbolAddress.has_key?(symbol)
301 end
302
303 # パラメータの値をハッシュ形式に格納
304 params = {}
305 apiDef[:PARAM].each do |apiParam|
306 next unless apiParam.has_key?(:NAME)
307 paramName = apiParam[:NAME]
308 next unless cfgInfo.has_key?(paramName) # パラメータがない場合
309 paramData = cfgInfo[paramName]
310
311 if apiParam.has_key?(:LIST)
312 params[paramName.to_sym] = []
313 paramData.each.with_index(1) do |param, index|
314 params[paramName.to_sym].push(GetParamValue(paramName, param, \
315 apiIndex, "_#{index}", apiParam, cfgInfo))
316 end
317 else
318 params[paramName.to_sym] = GetParamValue(paramName, paramData, \
319 apiIndex, "", apiParam, cfgInfo)
320 end
321 end
322
323 # ドメインIDを追加
324 if cfgInfo.has_key?(:DOMAIN)
325 domainName = cfgInfo[:DOMAIN]
326 params[:domain] = $domainId[domainName]
327 end
328
329 # クラスIDを追加
330 if cfgInfo.has_key?(:CLASS)
331 if apiIndex.nil?
332 params[:class] = cfgInfo[:CLASS]
333 else
334 symbol = "#{$cfg1_prefix}valueof_CLASS_#{apiIndex}"
335 value = GetSymbolValue(symbol, $sizeOfSigned, true)
336 params[:class] = NumStr.new(value, cfgInfo[:CLASS])
337 end
338 end
339
340 # API名,ファイル名,行番号を追加
341 params[:apiname] = cfgInfo[:APINAME]
342 params[:_file_] = cfgInfo[:_FILE_]
343 params[:_line_] = cfgInfo[:_LINE_]
344
345 # 登録キーを決定する
346 if apiDef.has_key?(:KEYPAR)
347 keyParam = params[apiDef[:KEYPAR].to_sym]
348 key = keyParam.val
349 if $cfgData[apiSym].has_key?(key)
350 # 登録キーの重複
351 error("E_OBJ: #{apiDef[:KEYPAR]} `#{keyParam}' " \
352 "is duplicated in #{cfgInfo[:APINAME]}",
353 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
354 end
355 else
356 key = $cfgData[apiSym].count + 1
357 end
358 $cfgData[apiSym][key] = params
359 end
360 end
361
362 #
363 # ID番号出力ファイルの生成
364 #
365 def self.OutputId(fileName)
366 idOutputFile = GenFile.new(fileName)
367 @objidValues.each do |objidParamName, objidList|
368 objidList.each do |objName, objidNumber|
369 idOutputFile.add("#{objName} #{objidNumber}")
370 end
371 end
372 end
373end
374
375#
376# パス2の処理
377#
378def Pass2
379 #
380 # パス1から引き渡される情
381報をファイルから読み込む
382 #
383 db = PStore.new(CFG1_OUT_DB)
384 db.transaction(true) do
385 $apiDefinition = db[:apiDefinition]
386 $symbolValueTable = db[:symbolValueTable]
387 $cfgFileInfo = db[:cfgFileInfo]
388 $includeFiles = db[:includeFiles]
389 $domainId = db[:domainId]
390 end
391 $cfg2Data = {}
392
393 #
394 # パス1の生成物を読み込む
395 #
396 Cfg1Out.Read()
397 abort if $errorFlag # エラー発生時はabortする
398
399 #
400 # 値取得シンボルをグローバル変数として定義する
401 #
402 DefineSymbolValue()
403
404 #
405 # 生成スクリプト(trbファイル)を実行する
406 #
407 $trbFileNames.each do |trbFileName|
408 if /^(.+):(\w+)$/ =~ trbFileName
409 trbFileName = $1
410 Cfg1Out.ReadPhase($2.to_sym)
411 end
412 IncludeTrb(trbFileName)
413 end
414
415 #
416 # ID番号出力ファイルの生成
417 #
418 if !$idOutputFileName.nil?
419 Cfg1Out.OutputId($idOutputFileName)
420 end
421
422 #
423 # パス3に引き渡す情
424報をファイルに生成
425 #
426 if $omitOutputDb.nil?
427 db = PStore.new(CFG2_OUT_DB)
428 db.transaction do
429 db[:apiDefinition] = $apiDefinition
430 db[:symbolValueTable] = $symbolValueTable
431 db[:cfgFileInfo] = $cfgFileInfo
432 db[:includeFiles] = $includeFiles
433 db[:cfgData] = $cfgData
434 db[:asmLabel] = $asmLabel
435 db[:endianLittle] = $endianLittle
436 db[:cfg2Data] = $cfg2Data
437 end
438 end
439end
Note: See TracBrowser for help on using the repository browser.