source: rubycfg_asp/trunk/asp_dcre/cfg/pass2.rb@ 313

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

ソースを追加

  • 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-2017 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 134 2017-06-23 11:34:26Z ertl-hiro $
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 apiDef = $apiDefinition[cfgInfo[:APINAME]]
173 error("#{apiDef.has_key?(:KEYPAR) ? "E_NOEXS" : "E_ID"}: " \
174 "`#{param}' in #{cfgInfo[:APINAME]} is not defined", \
175 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
176 value = nil
177 end
178 elsif apiParam.has_key?(:EXPTYPE) # 整数定数式パラメータ
179 if apiIndex.nil?
180 if param.is_a?(NumStr)
181 return(param)
182 else
183 return(NumStr.new(param))
184 end
185 else
186 symbol = "#{$cfg1_prefix}valueof_#{paramName}_#{apiIndex}#{index}"
187 value = GetSymbolValue(symbol, $sizeOfSigned, \
188 apiParam.has_key?(:SIGNED))
189 end
190 else # 一般定数式/文字列パラメータ
191 return(param)
192 end
193 return(NumStr.new(value, param))
194 end
195
196 #
197 # 指定したフェーズのためのパス1の生成物の読み込み
198 #
199 def self.ReadPhase(phase)
200 #
201 # オブジェクトIDの割当て
202 #
203 # 割り当てたオブジェクトIDは,@objidValuesに保持する.@objidValuesは,
204 # 2重のハッシュ(ハッシュのハッシュ)である.
205 #
206 # å…
207·ä½“的には,@objidValuesは,オブジェクトIDのパラメータ名(例えば,セ
208 # マフォIDであれば"semid".これを保持する変数名は,objidParamNameとす
209 # る)をキーとし,そのオブジェクトIDの割当て表(これを保持する変数名
210 # は,objidListとする)を値とするハッシュである.オブジェクトIDの割当
211 # て表は,オブジェクト名(これを保持する変数名は,objNameとする)をキー
212 # とし,そのID番号(これを保持する変数名は,objidNumberとする)を値と
213 # するハッシュである.
214 #
215 # 例えば,セマフォSEM1のID番号が1の場合には,次のように設定される.
216 # @objidValues["semid"]["SEM1"] == 1
217 #
218
219 # ID番号割り当ての前処理
220 objidParamNameList = []
221 $cfgFileInfo.each do |cfgInfo|
222 # プリプロセッサディレクティブは読み飛ばす
223 next if cfgInfo.has_key?(:DIRECTIVE)
224
225 apiDef = $apiDefinition[cfgInfo[:APINAME]]
226 # 異なるフェーズの静的APIは読み飛ばす
227 next if apiDef[:PHASE] != phase
228
229 apiIndex = cfgInfo[:INDEX]
230 if !apiIndex.nil?
231 # シンボルファイルに静的APIのインデックスが存在しなければ読み飛
232 # ばす(ifdef等で消えた静的API)
233 symbol = "#{$cfg1_prefix}static_api_#{apiIndex}"
234 next unless @symbolAddress.has_key?(symbol)
235 end
236
237 apiDef[:PARAM].each do |apiParam|
238 if apiParam.has_key?(:NAME) && apiParam.has_key?(:ID_DEF)
239 objidParamName = apiParam[:NAME]
240 objName = cfgInfo[objidParamName]
241 if $inputObjid.has_key?(objName)
242 # ID番号å…
243¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã«å®šç¾©ã•ã‚Œã¦ã„た場合
244 @objidValues[objidParamName][objName] = $inputObjid[objName]
245 else
246 @objidValues[objidParamName][objName] = nil
247 end
248 objidParamNameList.push(objidParamName)
249 end
250 end
251 end
252
253 # ID番号の割当て処理
254 objidParamNameList.each do |objidParamName|
255 objidList = @objidValues[objidParamName]
256
257 # 未使用のID番号のリスト(使用したものから消していく)
258 unusedObjidList = (1.upto(objidList.keys.size)).to_a
259
260 # 割り当て済みのID番号の処理
261 objidList.each do |objName, objidNumber|
262 if $inputObjid.has_key?(objName)
263 objidIndex = unusedObjidList.index($inputObjid[objName])
264 if objidIndex.nil?
265 # ID番号å…
266¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã§æŒ‡å®šã•ã‚ŒãŸå€¤ãŒä¸æ­£
267 error_exit("value of `#{objName}' in ID input file is illegal")
268 else
269 # 未使用のID番号のリストから削除
270 unusedObjidList.delete_at(objidIndex)
271 end
272 end
273 end
274
275 # ID番号の割当て
276 objidList.each do |objName, objidNumber|
277 if objidList[objName].nil?
278 # 以下で,@objidValuesを書き換えている
279 objidList[objName] = unusedObjidList.shift
280 end
281 end
282 end
283
284 #
285 # 静的APIデータをコンフィギュレーションデータ($cfgData)に格納
286 #
287 $cfgFileInfo.each do |cfgInfo|
288 # プリプロセッサディレクティブは読み飛ばす
289 next if cfgInfo.has_key?(:DIRECTIVE)
290
291 apiDef = $apiDefinition[cfgInfo[:APINAME]]
292 # 異なるフェーズの静的APIは読み飛ばす
293 next if apiDef[:PHASE] != phase
294
295 apiSym = apiDef[:API].to_sym
296 apiIndex = cfgInfo[:INDEX]
297 if !apiIndex.nil?
298 # シンボルファイルに静的APIのインデックスが存在しなければ読み飛
299 # ばす(ifdef等で消えた静的API)
300 symbol = "#{$cfg1_prefix}static_api_#{apiIndex}"
301 next unless @symbolAddress.has_key?(symbol)
302 end
303
304 # パラメータの値をハッシュ形式に格納
305 params = {}
306 apiDef[:PARAM].each do |apiParam|
307 next unless apiParam.has_key?(:NAME)
308 paramName = apiParam[:NAME]
309 next unless cfgInfo.has_key?(paramName) # パラメータがない場合
310 paramData = cfgInfo[paramName]
311
312 if apiParam.has_key?(:LIST)
313 params[paramName.to_sym] = []
314 paramData.each.with_index(1) do |param, index|
315 params[paramName.to_sym].push(GetParamValue(paramName, param, \
316 apiIndex, "_#{index}", apiParam, cfgInfo))
317 end
318 else
319 params[paramName.to_sym] = GetParamValue(paramName, paramData, \
320 apiIndex, "", apiParam, cfgInfo)
321 end
322 end
323
324 # ドメインIDを追加
325 if cfgInfo.has_key?(:DOMAIN)
326 domainName = cfgInfo[:DOMAIN]
327 params[:domain] = $domainId[domainName]
328 end
329
330 # クラスIDを追加
331 if cfgInfo.has_key?(:CLASS)
332 if apiIndex.nil?
333 params[:class] = cfgInfo[:CLASS]
334 else
335 symbol = "#{$cfg1_prefix}valueof_CLASS_#{apiIndex}"
336 value = GetSymbolValue(symbol, $sizeOfSigned, true)
337 params[:class] = NumStr.new(value, cfgInfo[:CLASS])
338 end
339 end
340
341 # API名,ファイル名,行番号を追加
342 params[:apiname] = cfgInfo[:APINAME]
343 params[:_file_] = cfgInfo[:_FILE_]
344 params[:_line_] = cfgInfo[:_LINE_]
345
346 # 登録キーを決定する
347 if apiDef.has_key?(:KEYPAR)
348 keyParam = params[apiDef[:KEYPAR].to_sym]
349 key = keyParam.val
350 if $cfgData[apiSym].has_key?(key)
351 # 登録キーの重複
352 error("E_OBJ: #{apiDef[:KEYPAR]} `#{keyParam}' " \
353 "is duplicated in #{cfgInfo[:APINAME]}",
354 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
355 end
356 else
357 key = $cfgData[apiSym].count + 1
358 end
359 $cfgData[apiSym][key] = params
360 end
361 end
362
363 #
364 # ID番号出力ファイルの生成
365 #
366 def self.OutputId(fileName)
367 idOutputFile = GenFile.new(fileName)
368 @objidValues.each do |objidParamName, objidList|
369 objidList.each do |objName, objidNumber|
370 idOutputFile.add("#{objName} #{objidNumber}")
371 end
372 end
373 end
374end
375
376#
377# パス2の処理
378#
379def Pass2
380 #
381 # パス1から引き渡される情
382報をファイルから読み込む
383 #
384 db = PStore.new(CFG1_OUT_DB)
385 db.transaction(true) do
386 $apiDefinition = db[:apiDefinition]
387 $symbolValueTable = db[:symbolValueTable]
388 $cfgFileInfo = db[:cfgFileInfo]
389 $includeFiles = db[:includeFiles]
390 $domainId = db[:domainId]
391 end
392 $cfg2Data = {}
393
394 #
395 # パス1の生成物を読み込む
396 #
397 Cfg1Out.Read()
398 abort if $errorFlag # エラー発生時はabortする
399
400 #
401 # 値取得シンボルをグローバル変数として定義する
402 #
403 DefineSymbolValue()
404
405 #
406 # 生成スクリプト(trbファイル)を実行する
407 #
408 $trbFileNames.each do |trbFileName|
409 if /^(.+):(\w+)$/ =~ trbFileName
410 trbFileName = $1
411 Cfg1Out.ReadPhase($2.to_sym)
412 end
413 IncludeTrb(trbFileName)
414 end
415
416 #
417 # ID番号出力ファイルの生成
418 #
419 if !$idOutputFileName.nil?
420 Cfg1Out.OutputId($idOutputFileName)
421 end
422
423 #
424 # パス3に引き渡す情
425報をファイルに生成
426 #
427 if $omitOutputDb.nil?
428 db = PStore.new(CFG2_OUT_DB)
429 db.transaction do
430 db[:apiDefinition] = $apiDefinition
431 db[:symbolValueTable] = $symbolValueTable
432 db[:cfgFileInfo] = $cfgFileInfo
433 db[:includeFiles] = $includeFiles
434 db[:cfgData] = $cfgData
435 db[:asmLabel] = $asmLabel
436 db[:endianLittle] = $endianLittle
437 db[:cfg2Data] = $cfg2Data
438 end
439 end
440end
Note: See TracBrowser for help on using the repository browser.