source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tecsgen/tecslib/plugin/TECSInfoPlugin.rb@ 374

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

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property charset set to UTF-8
  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 11.4 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TECS Generator
4# Generator for TOPPERS Embedded Component System
5#
6# Copyright (C) 2017-2018 by TOPPERS Project
7#--
8# 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11# 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15# スコード中に含まれていること.
16# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17# 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20# 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22# の無保証規定を掲載すること.
23# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24# 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26# と.
27# (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30# 作権表示,この利用条件および下記の無保証規定を掲載すること.
31# (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34# 報告すること.
35# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36# 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40# 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42# å…
43è²¬ã™ã‚‹ã“と.
44#
45# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50# の責任を負わない.
51#
52# $Id$
53#++
54
55#== CelltypePlugin for tTECSInfo
56class TECSInfoPlugin < CelltypePlugin
57
58 @@cell_list = []
59 #@celltype::Celltype
60 #@plugin_arg_str::String
61 #@plugin_arg_list::{argNameString=>argOptionString}
62 #@cell_list::[Cell]
63
64 #celltype:: Celltype セルタイプ(インスタンス)
65 def initialize( celltype, option )
66 super
67 if $unopt_entry == false then
68 cdl_info( "TIF0001 forcely set --unoptimize-entry by TECSInfoPlugin (by importing TECSInfo.cdl)" )
69 $unopt_entry = true
70 end
71 end
72
73 #=== 新しいセル
74 #cell:: Cell セル
75 #
76 # celltype プラグインを指定されたセルタイプのセルが生成された
77 # セルタイププラグインに対する新しいセルの報告
78 def new_cell( cell )
79 @@cell_list << cell
80
81 # AppFile は、重ね書きようなので、やめる
82 # p "import: cell nTECSInfo::tTECSInfoSub #{cell.get_namespace_path.to_s} under #{cell.get_region.get_name}"
83 # cell.show_tree 0
84 # TECSInfoSub セルのプロトタイプ宣言
85 fn = "#{$gen}/tmp_#{cell.get_region.get_global_name}_TECSInfoSub.cdl"
86 File.open( fn, "w" ){ |f|
87 f.print "/* prototype declaration of TECSInfoSub */\n"
88 nest = cell.get_region.gen_region_str_pre f
89 indent = " " * nest
90 f.print <<EOT
91#{indent}[in_through()]
92#{indent}region rTECSInfo {
93#{indent} cell nTECSInfo::tTECSInfoSub TECSInfoSub;
94#{indent}}; /* rTECSInfo} */
95EOT
96 cell.get_region.gen_region_str_post f
97 }
98 Import.new fn
99
100 # セルに cTECSInfo の結合があるか?
101 if cell.get_join_list.get_item( :cTECSInfo ) == nil then
102 # cTECSInfo = rTECSInfo::TECSInfosub.eTECSInfo; の追加
103 nsp = NamespacePath.new( :rTECSInfo, false )
104 nsp.append! :TECSInfoSub
105 rhs = Expression.create_cell_join_expression nsp, nil, :eTECSInfo
106 join = Join.new :cTECSInfo, nil, rhs
107 cell.new_join join
108 end
109 end
110
111 #=== tCelltype_factory.h に挿å…
112¥ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’生成する
113 # file 以外の他のファイルにファクトリコードを生成してもよい
114 # セルタイププラグインが指定されたセルタイプのみ呼び出される
115 def gen_factory file
116 File.open( "#{$gen}/include_all_signature_header.h", "w" ){ |f|
117 f.print <<EOT
118#ifndef include_all_signature_header_h
119#define include_all_signature_header_h
120
121EOT
122 Namespace.get_root.travers_all_signature{ |sig|
123 f.print "#include \"#{sig.get_global_name}_tecsgen.h\"\n"
124 }
125 f.print <<EOT
126
127#endif /* include_all_signature_header_h */
128EOT
129 }
130
131 undefs2 = [ :INITIALIZE_CB, :FOREACH_CELL, :END_FOREACH_CELL ]
132 f = AppFile.open( "#{$gen}/nTECSInfo_tVarDeclInfo_factory.h" )
133 Namespace.get_root.print_struct_define f
134
135 undefs = [ :VALID_IDX, :GET_CELLCB, :CELLCB, :CELLIDX,
136 :tVarDeclInfo_IDX, :ATTR_name, :ATTR_sizeIsExpr,
137 :ATTR_declType, :ATTR_offset ]
138
139 f.print <<EOT
140
141/***** Offset of attr & var of celltype *****/
142#define TOPPERS_CB_TYPE_ONLY
143
144/* In case a celltype has 'inline' entry,
145 * some macros are temporally defined
146 * even if TOPPERS_CB_TYPE_ONLY is defined.
147 * To avoid redefinition warning, undef these macros.
148 */
149#{ str=""; undefs.each{|u| str += "#undef #{u}\n" }; str }
150EOT
151 if $ram_initializer then
152 undefs2.each{|u|
153 f.print "#undef #{u}\n"
154 }
155 end
156 Namespace.get_root.print_celltype_define_offset f
157 f.print <<EOT
158
159/* redefine macros */
160#define tVarDeclInfo_IDX nTECSInfo_tVarDeclInfo_IDX
161
162EOT
163 if $ram_initializer then
164 f.print <<EOT
165#define FOREACH_CELL(i,p_cb) { (void)(i);
166#define END_FOREACH_CELL }
167#define INITIALIZE_CB(p_that) (void)(p_that);
168#define SET_CB_INIB_POINTER(i,p_that)
169EOT
170 end
171 f.close
172
173 undefs = [ :N_CP_cEntryInfo, :NCP_cEntryInfo, :N_CP_cCallInfo, :NCP_cCallInfo,
174 :N_CP_cAttrInfo, :NCP_cAttrInfo, :N_CP_cVarInfo, :NCP_cVarInfo,
175 :VALID_IDX, :GET_CELLCB, :CELLCB, :CELLIDX, :ATTR_name, :ATTR_b_singleton,
176 :ATTR_b_IDX_is_ID_act, :ATTR_sizeOfCB, :ATTR_sizeOfINIB, :ATTR_n_cellInLinUnit,
177 :ATTR_n_cellInSystem, :cEntryInfo_getName, :cEntryInfo_getNameLength,
178 :cEntryInfo_getSignatureInfo, :cEntryInfo_getArraySize, :cEntryInfo_isInline,
179 :cCallInfo_getName, :cCallInfo_getNameLength, :cCallInfo_getSignatureInfo,
180 :cCallInfo_getArraySize, :cCallInfo_getSpecifierInfo, :cCallInfo_getInternalInfo,
181 :cCallInfo_getLocationInfo, :cCallInfo_getOptimizeInfo, :cAttrInfo_getName,
182 :cAttrInfo_getOffset, :cAttrInfo_getTypeInfo, :cAttrInfo_getSizeIsExpr,
183 :cAttrInfo_getSizeIs, :cVarInfo_getName, :cVarInfo_getOffset, :cVarInfo_getTypeInfo,
184 :cVarInfo_getSizeIsExpr, :cVarInfo_getSizeIs, :cEntryInfo_refer_to_descriptor,
185 :cEntryInfo_ref_desc, :cCallInfo_refer_to_descriptor, :cCallInfo_ref_desc,
186 :cAttrInfo_refer_to_descriptor, :cAttrInfo_ref_desc, :cVarInfo_refer_to_descriptor,
187 :cVarInfo_ref_desc, :is_cEntryInfo_joined, :is_cCallInfo_joined,
188 :is_cAttrInfo_joined, :is_cVarInfo_joined, :eCelltypeInfo_getName,
189 :eCelltypeInfo_getNameLength, :eCelltypeInfo_getNAttr, :eCelltypeInfo_getAttrInfo,
190 :eCelltypeInfo_getNVar, :eCelltypeInfo_getVarInfo, :eCelltypeInfo_getNCall,
191 :eCelltypeInfo_getCallInfo, :eCelltypeInfo_getNEntry, :eCelltypeInfo_getEntryInfo,
192 :eCelltypeInfo_isSingleton, :eCelltypeInfo_isIDX_is_ID, :eCelltypeInfo_hasCB,
193 :eCelltypeInfo_hasINIB, :FOREACH_CELL, :END_FOREACH_CELL ]
194
195 f = AppFile.open( "#{$gen}/nTECSInfo_tCelltypeInfo_factory.h" )
196 undefs.each{ |u|
197 f.print "#undef #{u}\n"
198 }
199 f.print "#define TOPPERS_CB_TYPE_ONLY\n"
200 Namespace.get_root.print_celltype_define f
201 # FOREACH_CELL を出しなおす
202 ct = Namespace.find [ "::", :nTECSInfo, :tCelltypeInfo ]
203 ct.gen_ph_foreach_cell f
204 ct.gen_ph_cb_initialize_macro f
205 f.print "\n"
206 f.close
207
208 undefs = [ :VALID_IDX, :GET_CELLCB, :CELLCB, :CELLIDX,
209 :tCallInfo_IDX, :ATTR_name, :ATTR_offset, :ATTR_b_inCB,
210 :ATTR_b_optional, :ATTR_b_omit, :ATTR_b_dynamic,
211 :ATTR_b_ref_desc, :ATTR_b_allocator_port,
212 :ATTR_b_require_port, :ATTR_b_VMT_useless,
213 :ATTR_b_skelton_useless, :ATTR_b_cell_unique,
214 :cSignatureInfo_getName, :cSignatureInfo_getNameLength,
215 :cSignatureInfo_getNFunction,
216 :cSignatureInfo_getFunctionInfo,
217 :cSignatureInfo_refer_to_descriptor,
218 :cSignatureInfo_ref_desc, :eCallInfo_getName,
219 :eCallInfo_getNameLength, :eCallInfo_getSignatureInfo,
220 :eCallInfo_getArraySize, :eCallInfo_isOptional,
221 :eCallInfo_isDynamic, :eCallInfo_isRefDesc,
222 :eCallInfo_isOmit ]
223
224 f = AppFile.open( "#{$gen}/nTECSInfo_tCallInfo_factory.h" )
225 f.print <<EOT
226
227/***** Offset of attr & var of celltype *****/
228#define TOPPERS_CB_TYPE_ONLY
229
230/* In case a celltype has 'inline' entry,
231 * some macros are temporally defined
232 * even if TOPPERS_CB_TYPE_ONLY is defined.
233 * To avoid redefinition warning, undef these macros.
234 */
235#{ str=""; undefs.each{|u| str += "#undef #{u}\n" }; str }
236EOT
237 if $ram_initializer then
238 undefs2.each{|u|
239 f.print "#undef #{u}\n"
240 }
241 end
242
243 Namespace.get_root.print_call_define f
244 f.print <<EOT
245
246/* redefine macros */
247#define tCallInfo_IDX nTECSInfo_tCallInfo_IDX
248
249EOT
250 if $ram_initializer then
251 f.print <<EOT
252#define FOREACH_CELL(i,p_cb) { (void)(i);
253#define END_FOREACH_CELL }
254#define INITIALIZE_CB(p_that) (void)(p_that);
255#define SET_CB_INIB_POINTER(i,p_that)
256
257EOT
258 end
259 f.close
260
261 f = AppFile.open( "#{$gen}/nTECSInfo_tEntryInfo_factory.h" )
262 Namespace.get_root.print_entry_define f
263 f.close
264
265 undefs = [ :GET_CELLCB, :CELLCB, :CELLIDX, :ATTR_name, :INITIALIZE_CB, :FOREACH_CELL ]
266 f = AppFile.open( "#{$gen}/nTECSInfo_tCellInfo_factory.h" )
267 undefs.each{ |u|
268 f.print "#undef #{u}\n"
269 }
270 Region.get_root.print_cell_define f
271 # FOREACH_CELL を出しなおす
272 ct = Namespace.find [ "::", :nTECSInfo, :tCellInfo ]
273 ct.gen_ph_foreach_cell f
274 ct.gen_ph_cb_initialize_macro f
275 f.close
276
277 f = AppFile.open( "#{$gen}/nTECSInfo_tRawEntryDescriptorInfo_factory.h" )
278 Region.get_root.print_entry_descriptor_define f
279 f.close
280 end
281
282 #=== 後ろの CDL コードを生成
283 #プラグインの後ろの CDL コードを生成
284 #file:: File:
285 def self.gen_post_code( file )
286 if Generator.get_n_error > 0 then
287 Generator.info( "I9999 TECSInfoPlugin does not generate TECSInfo code because of early error" )
288 return
289 end
290 # 複数のプラグインの post_code が一つのファイルに含まれるため、以下のような見出しをつけること
291 file.print <<EOT
292/*------------ #{self.name} post code ------------*/
293EOT
294 @@cell_list.each{|cell|
295 root = cell.get_region # .get_link_root
296 TECSInfo.print_info file, root
297 }
298 end
299end
Note: See TracBrowser for help on using the repository browser.