source: asp3_wo_tecs/trunk/cfg/pass2.rb@ 304

Last change on this file since 304 was 304, checked in by ertl-honda, 7 years ago

コンフィギュレータをruby版に変更

File size: 10.2 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 32 2016-01-31 14:45:59Z ertl-hiro $
54#
55
56#
57# パス2の処理
58#
59
60#
61# パス1の生成物の読み込み
62#
63def ReadCfg1Out
64 # cfg1_out.symsの読み込み
65 symbolAddress = ReadSymbolFile(CFG1_OUT_SYMS)
66
67 # cfg1_out.srecの読み込み
68 begin
69 cfg1SRec = SRecord.new(CFG1_OUT_SREC)
70 rescue Errno::ENOENT, Errno::EACCES => ex
71 abort(ex.message)
72 end
73
74 # マジックナンバーの取得
75 if symbolAddress.has_key?(CFG1_MAGIC_NUM)
76 $asmLabel = ""
77 cfg1_prefix = CFG1_PREFIX
78 elsif symbolAddress.has_key?("_" + CFG1_MAGIC_NUM)
79 $asmLabel = "_"
80 cfg1_prefix = "_" + CFG1_PREFIX
81 else
82 error_exit("`#{CFG1_MAGIC_NUM}' is not found in `#{CFG1_OUT_SYMS}'")
83 end
84
85 magicNumberData = cfg1SRec.get_data(symbolAddress \
86 [$asmLabel + CFG1_MAGIC_NUM], 4)
87 if (magicNumberData == "12345678")
88 $bLittleEndian = false
89 elsif (magicNumberData == "78563412")
90 $bLittleEndian = true
91 else
92 error_exit("`#{CFG1_MAGIC_NUM}' is invalid in `#{CFG1_OUT_SREC}'")
93 end
94
95 # 固定出力した変数の取得
96 $sizeOfSigned = cfg1SRec.get_value(symbolAddress \
97 [$asmLabel + CFG1_SIZEOF_SIGNED], 4, false)
98
99 # 値取得シンボルの取得
100 $symbolValueTable.each do |symbolName, symbolData|
101 symbol = cfg1_prefix + symbolName
102 if symbolAddress.has_key?(symbol)
103 value = cfg1SRec.get_value(symbolAddress[symbol], \
104 $sizeOfSigned, symbolData.has_key?(:SIGNED))
105 if !value.nil?
106 symbolData[:VALUE] = value
107 end
108 end
109 end
110
111 #
112 # ID番号å…
113¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®å–り込み
114 #
115 $inputObjid = {}
116 if !$idInputFileName.nil?
117 begin
118 idInputFile = File.open($idInputFileName)
119 rescue Errno::ENOENT, Errno::EACCES => ex
120 abort(ex.message)
121 end
122
123 idInputFile.each do |line|
124 ( objidName, objidNumber ) = line.split(/\s+/)
125 $inputObjid[objidName] = objidNumber.to_i
126 end
127
128 idInputFile.close
129 end
130
131 #
132 # ハッシュの初期化
133 #
134 $cfgData = {}
135 objidValue = {}
136 $apiDefinition.each do |apiName, apiDef|
137 if apiDef.has_key?(:API)
138 $cfgData[apiDef[:API].to_sym] = {}
139 end
140 apiDef[:PARAM].each do |apiParam|
141 if apiParam.has_key?(:NAME) && apiParam.has_key?(:ID_DEF)
142 objidValue[apiParam[:NAME]] = {}
143 end
144 end
145 end
146
147 #
148 # オブジェクトIDの割り当て
149 #
150 # ID番号割り当ての前処理
151 $cfgFileInfo.each do |cfgInfo|
152 # プリプロセッサディレクティブと消えた静的APIは読み飛ばす
153 next if (cfgInfo.has_key?(:DIRECTIVE) || !symbolAddress.has_key?( \
154 "#{cfg1_prefix}static_api_#{cfgInfo[:INDEX]}"))
155
156 apiDef = $apiDefinition[cfgInfo[:API]]
157 apiDef[:PARAM].each do |apiParam|
158 if apiParam.has_key?(:NAME) && apiParam.has_key?(:ID_DEF)
159 objidName = apiParam[:NAME]
160 objidData = cfgInfo[objidName]
161 if $inputObjid.has_key?(objidData)
162 objidValue[objidName][objidData] = $inputObjid[objidData]
163 else
164 objidValue[objidName][objidData] = nil
165 end
166 end
167 end
168 end
169
170 # ID番号の割り当て処理
171 objidValue.each do |objidName, objidList|
172 # 未使用のID番号のリスト(使用したものから消していく)
173 unusedObjidList = (1.upto(objidList.keys.size)).to_a
174
175 # 割り当て済みのID番号の処理
176 objidList.each do |objidData, objidNumber|
177 if $inputObjid.has_key?(objidData)
178 objidIndex = unusedObjidList.index($inputObjid[objidData])
179 if objidIndex.nil?
180 # ID番号å…
181¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã§æŒ‡å®šã•ã‚ŒãŸå€¤ãŒä¸æ­£
182 error_exit("value of `#{objidData}' in ID input file is illegal")
183 else
184 # 未使用のID番号のリストから削除
185 unusedObjidList.delete_at(objidIndex)
186 end
187 end
188 end
189
190 # ID番号の割り当て
191 objidList.each do |objidData, objidNumber|
192 if objidList[objidData].nil?
193 # 以下で,objidValueを書き換えている
194 objidList[objidData] = unusedObjidList.shift
195 end
196 end
197 end
198
199 #
200 # 静的APIデータをハッシュ形式へ変換
201 #
202 $cfgFileInfo.each do |cfgInfo|
203 # プリプロセッサディレクティブは読み飛ばす
204 next if cfgInfo.has_key?(:DIRECTIVE)
205
206 apiDef = $apiDefinition[cfgInfo[:API]]
207 apiSym = apiDef[:API].to_sym
208 apiIndex = cfgInfo[:INDEX]
209
210 # シンボルファイルに静的APIのインデックスが存在しなければ読み飛ばす
211 #(ifdef等で消えた静的API)
212 next unless symbolAddress.has_key?("#{cfg1_prefix}static_api_#{apiIndex}")
213
214 # パラメータの値をハッシュ形式に格納
215 params = {}
216 apiDef[:PARAM].each do |apiParam|
217 if apiParam.has_key?(:NAME)
218 paramName = apiParam[:NAME]
219 if cfgInfo.has_key?(paramName)
220 paramData = cfgInfo[paramName]
221 value = nil
222 if apiParam.has_key?(:ID_DEF) # オブジェクト識別名(定義)
223 value = objidValue[paramName][paramData]
224 elsif apiParam.has_key?(:ID_REF) # オブジェクト識別名(参ç…
225§ï¼‰
226 if objidValue[paramName].has_key?(paramData)
227 value = objidValue[paramName][paramData]
228 else
229 error("E_OBJ: `#{paramData}' in #{cfgInfo[:API]} is not defined",
230 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
231 end
232 elsif apiParam.has_key?(:SIGNED) || apiParam.has_key?(:UNSIGNED)
233 symbol = "#{cfg1_prefix}valueof_#{paramName}_#{apiIndex}"
234 if (symbolAddress.has_key?(symbol))
235 value = cfg1SRec.get_value(symbolAddress[symbol], \
236 $sizeOfSigned, apiParam.has_key?(:SIGNED))
237 end
238 end
239 params[paramName.to_sym] = StrVal.new(paramData, value)
240 end
241 end
242 end
243
244 # 登録キーを決定する
245 if apiDef.has_key?(:KEYPAR)
246 keyParam = params[apiDef[:KEYPAR].to_sym]
247 key = keyParam.val
248 if $cfgData[apiSym].has_key?(key)
249 # 登録キーの重複
250 error("E_OBJ: #{apiDef[:KEYPAR]} `#{keyParam}'" \
251 " is duplicaed in #{cfgInfo[:API]}",
252 "#{cfgInfo[:_FILE_]}:#{cfgInfo[:_LINE_]}:")
253 end
254 else
255 key = $cfgData[apiSym].count + 1
256 end
257
258 # API名,ファイル名,行番号を追加
259 params[:apiname] = cfgInfo[:API]
260 params[:_file_] = cfgInfo[:_FILE_]
261 params[:_line_] = cfgInfo[:_LINE_]
262 $cfgData[apiSym][key] = params
263 end
264
265 #
266 # ID番号出力ファイルの生成
267 #
268 if !$idOutputFileName.nil?
269 idOutputFile = GenFile.new($idOutputFileName)
270 objidValue.each do |objidName, objidList|
271 objidList.each do |objidData, objidNumber|
272 idOutputFile.add("#{objidData} #{objidNumber}")
273 end
274 end
275 end
276end
277
278#
279# パス2の処理
280#
281def Pass2
282 #
283 # パス1から引き渡される情
284報をファイルから読み込む
285 #
286 db = PStore.new(CFG1_OUT_DB)
287 db.transaction(true) do
288 $apiDefinition = db[:apiDefinition]
289 $symbolValueTable = db[:symbolValueTable]
290 $cfgFileInfo = db[:cfgFileInfo]
291 $includeFiles = db[:includeFiles]
292 end
293
294 #
295 # パス1の生成物を読み込む
296 #
297 ReadCfg1Out()
298 abort if $errorFlag # エラー発生時はabortする
299
300 #
301 # 値取得シンボルをグローバル変数として定義する
302 #
303 DefineSymbolValue()
304
305 #
306 # 生成スクリプト(trbファイル)を実行する
307 #
308 $trbFileNames.each do |trbFileName|
309 IncludeTrb(trbFileName)
310 end
311
312 #
313 # パス3に引き渡す情
314報をファイルに生成
315 #
316 if $omitOutputDb.nil?
317 db = PStore.new(CFG2_OUT_DB)
318 db.transaction do
319 db[:apiDefinition] = $apiDefinition
320 db[:symbolValueTable] = $symbolValueTable
321 db[:cfgFileInfo] = $cfgFileInfo
322 db[:includeFiles] = $includeFiles
323 db[:cfgData] = $cfgData
324 db[:asmLabel] = $asmLabel
325 db[:bLittleEndian] = $bLittleEndian
326 end
327 end
328end
Note: See TracBrowser for help on using the repository browser.