tecscde 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rubocop.yml +125 -0
  4. data/.rubocop_todo.yml +188 -0
  5. data/CHANGELOG.md +3 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE +46 -0
  8. data/LICENSE.ja +32 -0
  9. data/README.ja.md +200 -0
  10. data/README.md +35 -0
  11. data/Rakefile +27 -0
  12. data/bin/tecscde +64 -0
  13. data/glade/tecscde-cell-property.glade +205 -0
  14. data/glade/tecscde-celltype-property.glade +172 -0
  15. data/glade/tecscde-celltype.glade +414 -0
  16. data/glade/tecscde-export.glade +161 -0
  17. data/glade/test-cell-plugin.rb +51 -0
  18. data/glade/test-cell-property.rb +35 -0
  19. data/glade/test-export.rb +35 -0
  20. data/glade/test-palette.rb +26 -0
  21. data/lib/tcflow.rb +148 -0
  22. data/lib/tecscde.rb +65 -0
  23. data/lib/tecscde/NewCell.png +0 -0
  24. data/lib/tecscde/SelectArrow.png +0 -0
  25. data/lib/tecscde/attr_tree_view.rb +253 -0
  26. data/lib/tecscde/cell_plugin_dialog.glade +294 -0
  27. data/lib/tecscde/cell_plugin_dialog.rb +89 -0
  28. data/lib/tecscde/celltype_tree_view.rb +105 -0
  29. data/lib/tecscde/change_set_control.rb +35 -0
  30. data/lib/tecscde/change_set_control/change_set.rb +32 -0
  31. data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
  32. data/lib/tecscde/command.rb +35 -0
  33. data/lib/tecscde/control.rb +491 -0
  34. data/lib/tecscde/highlighted_objects.rb +180 -0
  35. data/lib/tecscde/logger.rb +74 -0
  36. data/lib/tecscde/main_view_and_model.rb +80 -0
  37. data/lib/tecscde/palette.glade +553 -0
  38. data/lib/tecscde/palette.rb +174 -0
  39. data/lib/tecscde/preferences.glade +117 -0
  40. data/lib/tecscde/preferences.rb +44 -0
  41. data/lib/tecscde/tecs_model.rb +1137 -0
  42. data/lib/tecscde/tecs_model/hbar.rb +68 -0
  43. data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
  44. data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
  45. data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
  46. data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
  47. data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
  48. data/lib/tecscde/tecs_model/tm_join.rb +293 -0
  49. data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
  50. data/lib/tecscde/tecs_model/tm_port.rb +238 -0
  51. data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
  52. data/lib/tecscde/tecs_model/tm_region.rb +107 -0
  53. data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
  54. data/lib/tecscde/tecs_model/vbar.rb +68 -0
  55. data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
  56. data/lib/tecscde/templates/_join_info.cde.erb +28 -0
  57. data/lib/tecscde/templates/main.cde.erb +49 -0
  58. data/lib/tecscde/tm_object.rb +91 -0
  59. data/lib/tecscde/version.rb +4 -0
  60. data/lib/tecscde/view.rb +58 -0
  61. data/lib/tecscde/view/cairo_matrix.rb +90 -0
  62. data/lib/tecscde/view/canvas.rb +59 -0
  63. data/lib/tecscde/view/constants.rb +114 -0
  64. data/lib/tecscde/view/main_view.rb +1245 -0
  65. data/lib/tecsflow.rb +475 -0
  66. data/lib/tecsflow/C_parser.tab.rb +2471 -0
  67. data/lib/tecsflow/C_parser.y.rb +1087 -0
  68. data/lib/tecsflow/classes.rb +421 -0
  69. data/lib/tecsgen.rb +581 -0
  70. data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
  71. data/lib/tecsgen/core/C_parser.y +1032 -0
  72. data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
  73. data/lib/tecsgen/core/bnf.tab.rb +5193 -0
  74. data/lib/tecsgen/core/bnf.y +2211 -0
  75. data/lib/tecsgen/core/componentobj.rb +7901 -0
  76. data/lib/tecsgen/core/ctypes.rb +226 -0
  77. data/lib/tecsgen/core/expression.rb +1031 -0
  78. data/lib/tecsgen/core/gen_xml.rb +374 -0
  79. data/lib/tecsgen/core/generate.rb +5206 -0
  80. data/lib/tecsgen/core/location.rb +116 -0
  81. data/lib/tecsgen/core/messages.rb +101 -0
  82. data/lib/tecsgen/core/optimize.rb +456 -0
  83. data/lib/tecsgen/core/plugin.rb +332 -0
  84. data/lib/tecsgen/core/pluginModule.rb +165 -0
  85. data/lib/tecsgen/core/syntaxobj.rb +1234 -0
  86. data/lib/tecsgen/core/tecs_lang.rb +306 -0
  87. data/lib/tecsgen/core/tecsgen.rb +453 -0
  88. data/lib/tecsgen/core/tecsinfo.rb +860 -0
  89. data/lib/tecsgen/core/tool_info.rb +258 -0
  90. data/lib/tecsgen/core/types.rb +1632 -0
  91. data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
  92. data/lib/tecsgen/core/value.rb +650 -0
  93. data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
  94. data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
  95. data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
  96. data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
  97. data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
  98. data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
  99. data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
  100. data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
  101. data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
  102. data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
  103. data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
  104. data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
  105. data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
  106. data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
  107. data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
  108. data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
  109. data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
  110. data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
  111. data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
  112. data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
  113. data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
  114. data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
  115. data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
  116. data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
  117. data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
  118. data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
  119. data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
  120. data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
  121. data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
  122. data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
  123. data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
  124. data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
  125. data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
  126. data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
  127. data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
  128. data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
  129. data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
  130. data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
  131. data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
  132. data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
  133. data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
  134. data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
  135. data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
  136. data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
  137. data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
  138. data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
  139. data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
  140. data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
  141. data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
  142. data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
  143. data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
  144. data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
  145. data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
  146. data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
  147. data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
  148. data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
  149. data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
  150. data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
  151. data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
  152. data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
  153. data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
  154. data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
  155. data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
  156. data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
  157. data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
  158. data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
  159. data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
  160. data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
  161. data/lib/tecsgen/version.rb +6 -0
  162. data/samples/FigureSamples/active/active.cde +104 -0
  163. data/samples/FigureSamples/active/active.cdl +20 -0
  164. data/samples/FigureSamples/active/active.pdf +0 -0
  165. data/samples/FigureSamples/active/active.png +0 -0
  166. data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
  167. data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
  168. data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
  169. data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
  170. data/samples/FigureSamples/allocator/allocator.cde +171 -0
  171. data/samples/FigureSamples/allocator/allocator.cdl +58 -0
  172. data/samples/FigureSamples/allocator/allocator.png +0 -0
  173. data/samples/FigureSamples/basic/Makefile +87 -0
  174. data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
  175. data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
  176. data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
  177. data/samples/FigureSamples/basic/basic.cde +93 -0
  178. data/samples/FigureSamples/basic/basic.cdl +46 -0
  179. data/samples/FigureSamples/basic/basic.png +0 -0
  180. data/samples/FigureSamples/callback/callback.cde +130 -0
  181. data/samples/FigureSamples/callback/callback.cdl +29 -0
  182. data/samples/FigureSamples/callback/callback.png +0 -0
  183. data/samples/FigureSamples/carray/carray.cde +144 -0
  184. data/samples/FigureSamples/carray/carray.cdl +38 -0
  185. data/samples/FigureSamples/carray/carray.png +0 -0
  186. data/samples/FigureSamples/cearray/cearray.cde +314 -0
  187. data/samples/FigureSamples/cearray/cearray.cdl +60 -0
  188. data/samples/FigureSamples/cearray/cearray.png +0 -0
  189. data/samples/FigureSamples/composite/composite-internal.png +0 -0
  190. data/samples/FigureSamples/composite/composite.cde +216 -0
  191. data/samples/FigureSamples/composite/composite.cdl +95 -0
  192. data/samples/FigureSamples/composite/composite.png +0 -0
  193. data/samples/FigureSamples/earray/earray.cde +142 -0
  194. data/samples/FigureSamples/earray/earray.cdl +38 -0
  195. data/samples/FigureSamples/earray/earray.png +0 -0
  196. data/samples/FigureSamples/join/Makefile +87 -0
  197. data/samples/FigureSamples/join/join.cde +132 -0
  198. data/samples/FigureSamples/join/join.cdl +40 -0
  199. data/samples/FigureSamples/join/join.png +0 -0
  200. data/samples/FigureSamples/relay/Makefile +99 -0
  201. data/samples/FigureSamples/relay/relay-internal.png +0 -0
  202. data/samples/FigureSamples/relay/relay.cde +284 -0
  203. data/samples/FigureSamples/relay/relay.cdl +52 -0
  204. data/samples/FigureSamples/relay/relay.png +0 -0
  205. data/samples/FigureSamples/rpc/Makefile +123 -0
  206. data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
  207. data/samples/FigureSamples/rpc/rpc.cde +245 -0
  208. data/samples/FigureSamples/rpc/rpc.png +0 -0
  209. data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
  210. data/samples/SimpleSample/Makefile +25 -0
  211. data/samples/SimpleSample/SimpleSample/Makefile +86 -0
  212. data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
  213. data/samples/SimpleSample/SimpleSample/README.txt +106 -0
  214. data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
  215. data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
  216. data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
  217. data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
  218. data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
  219. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
  220. data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
  221. data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
  222. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
  223. data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
  224. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
  225. data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
  226. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
  227. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
  228. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
  229. data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
  230. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
  231. data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
  232. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
  233. data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
  234. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
  235. data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
  236. data/tecscde.gemspec +41 -0
  237. metadata +353 -0
@@ -0,0 +1,57 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2008-2017 by TOPPERS Project
6
+ #--
7
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12
+ # スコード中に含まれていること.
13
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16
+ # の無保証規定を掲載すること.
17
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19
+ # と.
20
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
22
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23
+ # 報告すること.
24
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28
+ # 免責すること.
29
+ #
30
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34
+ # の責任を負わない.
35
+ #
36
+ # $Id: MultiPlugin.rb 2952 2018-05-07 10:19:07Z okuma-top $
37
+ #++
38
+
39
+ #== MultiPlugin クラス
40
+ class MultiPlugin < Node
41
+ def self.get_plugin(superClass)
42
+ # case when (つまりは ===) では、期待したように一致しない模様
43
+ if superClass == SignaturePlugin
44
+ return SignaturePlugin
45
+ elsif superClass == CelltypePlugin
46
+ return CelltypePlugin
47
+ elsif superClass == CellPlugin
48
+ return CellPlugin
49
+ elsif superClass == ThroughPlugin
50
+ return ThroughPlugin
51
+ elsif superClass == DomainPlugin
52
+ return DomainPlugin
53
+ else
54
+ return nil
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,1217 @@
1
+ #
2
+ # TECS Generator
3
+ # Generator for TOPPERS Embedded Component System
4
+ #
5
+ # Copyright (C) 2015 by Ushio Laboratory
6
+ # Graduate School of Engineering Science, Osaka Univ., JAPAN
7
+ # Copyright (C) 2015-2016 by Embedded and Real-Time Systems Laboratory
8
+ # Graduate School of Information Science, Nagoya Univ., JAPAN
9
+ # Copyright (C) 2015-2018 by TOPPERS Project
10
+ #
11
+ #--
12
+ # 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13
+ # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14
+ # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15
+ # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16
+ # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17
+ # スコード中に含まれていること.
18
+ # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19
+ # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20
+ # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21
+ # の無保証規定を掲載すること.
22
+ # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23
+ # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24
+ # と.
25
+ # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26
+ # 作権表示,この利用条件および下記の無保証規定を掲載すること.
27
+ # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28
+ # 報告すること.
29
+ # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30
+ # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31
+ # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32
+ # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33
+ # 免責すること.
34
+ #
35
+ # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36
+ # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37
+ # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38
+ # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39
+ # の責任を負わない.
40
+ #
41
+ # $Id: NotifierPlugin.rb 2952 2018-05-07 10:19:07Z okuma-top $
42
+ #++
43
+
44
+ NotifierPluginArgProc = {
45
+ "factory" => Proc.new {|obj, rhs| obj.set_factory(rhs) },
46
+ "output_file" => Proc.new {|obj, rhs| obj.set_factory_output_file(rhs) }
47
+ }
48
+
49
+ class NotifierPlugin < CelltypePlugin
50
+ # ---------- アダプタ関数の生成 -------------
51
+ #
52
+ # siHandlerBodyの受け口関数は,タイムイベント通知の通知先として直接指定する
53
+ # ことはできない.シグネチャが一致していないことが理由である.このため,アダ
54
+ # プタとして動作する関数を生成し,カーネルからの呼出しをTECSの呼出しに変換で
55
+ # きるようにする必要がある.
56
+ #
57
+ # 基本的には,受け口毎にアダプタ関数を生成すれば十分である.しかし,これでは
58
+ # メモリ消費量が不必要に増加してしまう.そこで,通知先関数にintptr_t型の引数
59
+ # を渡せることに着目し,関数の"一般化"を図る.すなわち受け口のある属性(ここ
60
+ # では,結合先のセル,添字などを指す)を,アダプタ関数の引数として受け取れる
61
+ # ようにし,1個のアダプタ関数を2個以上の結合に対し用いることができるように
62
+ # する.
63
+ #
64
+ # アダプタ関数の属性について整理すると,
65
+ # - 受け口関数 - 一般化を行うと,実行時コストが大きく増大してしまうことが
66
+ # 確認されている.このため,一般化は行わない.EntryPropertyにも含めない.
67
+ # - セルインデックス - CELLIDX型で,型の規定はないが,"ポインタ値であったり
68
+ # 整数値であったりする。" (TECS 5.3.6) より,インデックスかポインタある
69
+ # ことが分かる.インデックスだとすると,この値はセルCBのアドレッシングに
70
+ # 使用されるので,intptr_tに収まる筈である.ポインタの場合,当然intptr_t
71
+ # に収まる.
72
+ # - 受け口配列の添字 - int_t.同様にintptr_tに収まる筈である.
73
+ # これらのうち,セルインデックスと受け口配列の添字はパラメータに含めることが
74
+ # できそうであるが,両方は無理である.
75
+ # 両方を格納した配列を生成し,その配列の要素へのポインタを渡すようにするとい
76
+ # う選択肢も可能であるが,実行速度を優先するために,この方法はとらなかった.
77
+ #
78
+ # このため,一般化は以下のパターンに分類して行う.
79
+ #
80
+ # 1. セルインデックスのみ一般化.セルインデックスのパターン数が受け口配列の
81
+ # 添字のパターン数より多いか,あるいは受け口が配列でない場合に行われる.
82
+ # 2. 受け口配列の添字のみ一般化.この場合,セルごとに異なる関数を用いる.
83
+ #
84
+ # これより,各受け口関数について,アダプタ関数の生成個数は,
85
+ # O(min{セルインデックスのパターン数, 添字のパターン数})
86
+ # となる.
87
+ #
88
+ # プラグインでの処理をワンパスで行うために,tecsgen.cfgではアダプタ関数を直
89
+ # 接指定するのではなく,代わりにアダプタ関数を表すマクロを使用する.この
90
+ # マクロはアダプタ関数ハンドルと呼ぶことにする.
91
+ # アダプタ関数ハンドルは,次の2個の要素から成る.
92
+ # - アダプタ関数へののポインタ
93
+ # - アダプタ関数の引数
94
+ #
95
+ # $Id: NotifierPlugin.rb 2952 2018-05-07 10:19:07Z okuma-top $
96
+
97
+ # @private
98
+ class AdapterGenerator
99
+ # 結合先に関する属性を含む.セル,受け口配列の添字から成る.
100
+ # 同一のEntryPropertyとなる結合は,全く同じ方法でその受け口関数を呼び
101
+ # 出せる.
102
+ # @private
103
+ class EntryProperty
104
+ # @return [Cell] 受け口側のセル.
105
+ attr_reader :cell
106
+
107
+ # @return [Integer, nil] 受け口配列の添字.配列でない場合はnil.
108
+ attr_reader :subscript
109
+
110
+ def initialize(cell, subscript)
111
+ @cell = cell
112
+ @subscript = subscript
113
+ end
114
+
115
+ def self.from_join(join)
116
+ EntryProperty.new(join.get_rhs_cell, join.get_rhs_subscript)
117
+ end
118
+
119
+ # 同値性の定義.Hashのキーとして使用するのに必要.
120
+ def eql?(o) @cell == o.cell && @subscript == o.subscript end
121
+
122
+ def hash() @cell.hash ^ @subscript.hash end
123
+ end
124
+
125
+ # @private
126
+ class EntryPort
127
+ # @param [Port] port 結合先のセルのセルタイプの受け口.
128
+ def initialize(port, prefix)
129
+ @port = port
130
+ @global_name = "#{prefix}_#{@port.get_celltype.get_global_name}_#{@port.get_name}"
131
+
132
+ # 受け口関数名.siHandlerBodyを想定しているので,関数名はmainで固定である.
133
+ @entry_fn_name = "#{@port.get_celltype.get_global_name}_#{@port.get_name}_main"
134
+
135
+ @props = [] # Array<EntryProperty>
136
+ @prop_map = {} # Hash<EntryProperty, Integer>
137
+ end
138
+
139
+ # @return [String] グローバルに一意(なものとして扱えるよう)な識別子.
140
+ attr_reader :global_name
141
+
142
+ # @return [Port]
143
+ attr_reader :port
144
+
145
+ # 指定したEntryPropertyに対応するアダプタ関数ハンドルを取得する.
146
+ # @param [EntryProperty] ep
147
+ # @return [String] アダプタ関数ハンドル.
148
+ # @private
149
+ def adapter_handle_for_entry_property(ep)
150
+ index = @prop_map.fetch(ep)
151
+ return [
152
+ "#{@global_name}_#{index}_fp",
153
+ "#{@global_name}_#{index}_arg"
154
+ ]
155
+ end
156
+
157
+ # 結合先の情報に応じたアダプタ関数をソース・ヘッダーに出力する.
158
+ # 一般化指定は,`cell`または`subscript`の一方のみ行うことができる.
159
+ #
160
+ # @param [AdapterGenerator] context
161
+ # @param [String] fn_name 関数名.
162
+ # @param [Cell, Symbol] cell セル.セルについて一般化する場合は `:generic`
163
+ # @param [Integer, Symbol, nil] subscript 添字.添字について一般化する場合は `:generic`
164
+ # @param [Celltype] 呼び先のセルタイプ、cell==:generic の場合のみ有効
165
+ # @private
166
+ def generate_inner(context, fn_name, cell, subscript, callee_ct=nil)
167
+ source_file = context.source_file
168
+ header_file = context.header_file
169
+
170
+ source_file.print "void #{fn_name}(intptr_t extinf) {\n"
171
+
172
+ params = []
173
+ ct = @port.get_celltype
174
+
175
+ # シングルトンセルタイプ以外では,CELLIDXの指定が必要.
176
+ unless ct.is_singleton?
177
+ if cell == :generic
178
+ params << "(#{callee_ct.get_global_name}_IDX)extinf"
179
+ # params << "(CELLIDX)extinf"
180
+ else
181
+ # セルのCELLIDXを得る
182
+ if ct.has_INIB? || ct.has_CB?
183
+ params << ct.get_name_array(cell)[7]
184
+ else
185
+ params << "0"
186
+ end
187
+ end
188
+ end
189
+
190
+ # 受け口配列の添字.
191
+ if @port.get_array_size
192
+ if subscript == :generic
193
+ params << "(int_t)extinf"
194
+ else
195
+ params << subscript.to_s
196
+ end
197
+ end
198
+
199
+ params_str = params.join(", ")
200
+
201
+ source_file.print "\t#{@entry_fn_name}(#{params_str});\n"
202
+ source_file.print "}\n\n"
203
+
204
+ header_file.print "extern void #{fn_name}(intptr_t extinf);\n\n"
205
+ end
206
+
207
+ # 指定したJoinに対応するアダプタ関数ハンドルを取得する.
208
+ # @return [Array] アダプタ関数ハンドル.
209
+ def make_adapter_handle(join)
210
+ prop = EntryProperty.from_join(join)
211
+ unless @prop_map.has_key?(prop)
212
+ @prop_map[prop] = @props.length
213
+ @props << prop
214
+ end
215
+ return adapter_handle_for_entry_property(prop)
216
+ end
217
+
218
+ # ソース・ヘッダーの記述を生成する.
219
+ # @param [AdapterGenerator] context
220
+ def generate(context)
221
+ header_file = context.header_file
222
+ return if @props.empty?
223
+
224
+ ct = @port.get_celltype
225
+
226
+ header_file.print "/*\n * #{@global_name}\n"
227
+
228
+ cells = @props.group_by {|prop| prop.cell }
229
+ subscripts = @props.group_by {|prop| prop.subscript }
230
+ no_cellidx = false
231
+ if !(ct.has_INIB? || ct.has_CB?)
232
+ # CB, INIB最適化により,CB, INIBが両方不要になったケース.
233
+ # CELLIDXが不要であるので,セルについて一般化しても意味
234
+ # はないので,添字による一般化を選択する.
235
+ generalize_by_cell_idx = false
236
+ no_cellidx = true
237
+
238
+ # 全てのセルを同一視する.
239
+ cells = { @props[0].cell => @props }
240
+
241
+ header_file.print " * No INIB & CB: generalized by subscript\n"
242
+ elsif @port.get_array_size
243
+ # 一般化パターンの分類を行うために,受け口側セルや添字の
244
+ # パターン数を分析して,最適な方を選択する.
245
+ generalize_by_cell_idx = cells.length >= subscripts.length
246
+ if generalize_by_cell_idx
247
+ header_file.print " * more cells than subscripts: generalized by cell\n"
248
+ else
249
+ header_file.print " * more subscripts than cells: generalized by subscript\n"
250
+ end
251
+ else
252
+ # 常にCELLIDXで一般化
253
+ generalize_by_cell_idx = true
254
+ header_file.print " * non-array entry port: generalized by cell\n"
255
+ end
256
+
257
+ header_file.print " */\n\n"
258
+
259
+ if generalize_by_cell_idx
260
+ # CELLIDXについて一般化
261
+ subscripts.each {|subscript, props|
262
+ if subscript
263
+ fn_name = "#{@global_name}_adap_#{subscript}"
264
+ else
265
+ # 受け口配列でない場合
266
+ fn_name = "#{@global_name}_adap"
267
+ end
268
+
269
+ generate_inner context, fn_name,
270
+ :generic, subscript, ct
271
+
272
+ props.each {|prop|
273
+ handle = adapter_handle_for_entry_property(prop)
274
+
275
+ # セルのCELLIDXを得る
276
+ if ct.has_INIB? || ct.has_CB?
277
+ idx = ct.get_name_array(prop.cell)[7]
278
+ else
279
+ idx = "0"
280
+ end
281
+ header_file.print "\#define #{handle[0]} &#{fn_name}\n"
282
+ header_file.print "\#define #{handle[1]} #{idx}\n\n"
283
+ }
284
+ }
285
+ else
286
+ # 添字について一般化
287
+ cells.each {|cell, props|
288
+ if no_cellidx
289
+ # CB/INIB なし
290
+ fn_name = "#{@global_name}_adap"
291
+ else
292
+ fn_name = "#{@global_name}_adap_#{cell.get_global_name}"
293
+ end
294
+
295
+ generate_inner context, fn_name,
296
+ cell, :generic
297
+
298
+ props.each {|prop|
299
+ handle = adapter_handle_for_entry_property(prop)
300
+
301
+ header_file.print "\#define #{handle[0]} &#{fn_name}\n"
302
+ header_file.print "\#define #{handle[1]} #{prop.subscript || 0}\n\n"
303
+ }
304
+ }
305
+ end
306
+ end
307
+ end
308
+
309
+ # @private
310
+ attr :source_file
311
+
312
+ # @private
313
+ attr :header_file
314
+
315
+ # @param [String] celltype_name ハンドラ関数のセルタイプ.
316
+ # @param [String] prefix 名前衝突を防ぐためのプレフィックス.
317
+ def initialize(celltype_name, prefix)
318
+ @celltype_name = celltype_name
319
+ @prefix = prefix
320
+
321
+ # Hash<Port, EntryPort>
322
+ @entry_ports = {}
323
+ end
324
+
325
+ # ===AdapterGenerator#make_adapter_handle===
326
+ # 指定した結合の呼出しを行うためのアダプタ関数ハンドルを生成する.
327
+ # @return [Array] アダプタ関数ハンドル.
328
+ def make_adapter_handle(join)
329
+ entry_port = @entry_ports[join.get_rhs_port]
330
+ unless entry_port
331
+ entry_port = EntryPort.new(join.get_rhs_port,
332
+ "#{@celltype_name}_#{@prefix}")
333
+ @entry_ports[join.get_rhs_port] = entry_port
334
+ end
335
+ return entry_port.make_adapter_handle(join)
336
+ end
337
+
338
+ # ===AdapterGenerator#finish===
339
+ # 各受け口に対し,アダプタ関数を生成する.
340
+ def finish
341
+ @source_file = AppFile.open("#{$gen}/#{@celltype_name}.c")
342
+ @source_file.print "\n/* Generated by #{self.class.name} */\n\n"
343
+ @source_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"
344
+ @source_file.print "\#include \"#{@celltype_name}_tecsgen.h\"\n\n"
345
+
346
+ @header_file = AppFile.open("#{$gen}/#{@celltype_name}.h")
347
+ @header_file.print "\n/* Generated by #{self.class.name} */\n\n"
348
+
349
+ # NotifierPluginを使用するセルタイプが複数ある場合,それぞれに
350
+ # 対しAdapterGenerator#finishが呼び出される.tTimeEventHandler.hに
351
+ # 続けて書き込んでしまうと,ヘッダーガードの関係で2回目以降の記述
352
+ # が読み込まれなくなってしまう.このため,ファイル名 + セルタイプ名
353
+ # という少し特殊なヘッダーガードを用いる.
354
+ header_guard = "#{@celltype_name}_H_#{@prefix}"
355
+
356
+ @header_file.print "\#ifndef #{header_guard}\n"
357
+ @header_file.print "\#define #{header_guard}\n\n"
358
+
359
+ # カーネルコンフィギュレータを実行する際,ハンドラ受け口のセルタイプ
360
+ # のセルCBの定義が必要な場合がある.
361
+ @header_file.print "\#include \"#{@celltype_name}_aux.h\"\n\n"
362
+
363
+ # 結合先のセルタイプの定義は,自分のセルのtecsgen.hよりも先に
364
+ # 読み込まなければならないが,このプラグインが複数実行されると,
365
+ # 順序が崩れてしまう.そこで,結合先のセルタイプの定義はもう一つの
366
+ # ヘッダーファイル(tCelltypeName_aux.h)から読み込むようにする.
367
+ aux_header_file = AppFile.open("#{$gen}/#{@celltype_name}_aux.h")
368
+ aux_header_file.print "\n/* Generated by #{self.class.name} */\n\n"
369
+
370
+ aux_header_guard = "#{@celltype_name}_AUX_H_#{@prefix}"
371
+
372
+ aux_header_file.print "\#ifndef #{aux_header_guard}\n"
373
+ aux_header_file.print "\#define #{aux_header_guard}\n\n"
374
+
375
+ cb_type_only_guard = "#{@celltype_name}_AUX_H_#{@prefix}_CB_TYPE_ONLY"
376
+
377
+ # 結合先のセルタイプの定義を読み込む
378
+ aux_header_file.print "#ifndef TOPPERS_CB_TYPE_ONLY\n"
379
+ aux_header_file.print "#define TOPPERS_CB_TYPE_ONLY\n"
380
+ aux_header_file.print "#define #{cb_type_only_guard}\n"
381
+ aux_header_file.print "#endif\n"
382
+ @entry_ports.values.map {|ep|
383
+ ep.port.get_celltype
384
+ }.uniq.each {|ct|
385
+ hname = "#{ct.get_global_name}_tecsgen.#{$h_suffix}"
386
+ aux_header_file.print "\#include \"#{hname}\"\n"
387
+ }
388
+ aux_header_file.print "#ifdef #{cb_type_only_guard}\n"
389
+ aux_header_file.print "#undef #{cb_type_only_guard}\n"
390
+ aux_header_file.print "#undef TOPPERS_CB_TYPE_ONLY\n"
391
+ aux_header_file.print "#endif\n\n"
392
+
393
+ aux_header_file.print "\#endif\n"
394
+ aux_header_file.close
395
+
396
+ @entry_ports.each {|port, entry_port|
397
+ entry_port.generate self
398
+ }
399
+
400
+ @header_file.print "\#endif\n"
401
+
402
+ @source_file.close
403
+ @header_file.close
404
+ end
405
+ end
406
+
407
+ # ------ 通知のハンドラの種類の定義 -------
408
+
409
+ class Handler
410
+ def initialize(call_port_name)
411
+ @call_port_name = call_port_name
412
+ end
413
+
414
+ attr :call_port_name
415
+ end
416
+
417
+ # 通常のハンドラ
418
+ EVENT_HANDLER = Handler.new("ciNotificationHandler")
419
+
420
+ # エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)
421
+ ERROR_HANDLER = Handler.new("ciErrorNotificationHandler")
422
+
423
+ HANDLERS = [
424
+ EVENT_HANDLER,
425
+ ERROR_HANDLER
426
+ ]
427
+
428
+ class HandlerAttribute
429
+ def initialize(name, error_name = nil)
430
+ @name = name
431
+ @error_name = error_name || (name + "ForError")
432
+ end
433
+
434
+ def name_for_handler(handler)
435
+ case handler
436
+ when EVENT_HANDLER then return @name
437
+ when ERROR_HANDLER then return @error_name
438
+ else raise "unknown handler #{handler}"
439
+ end
440
+ end
441
+ end
442
+
443
+ # ------ 通知の属性の定義 -------
444
+ #
445
+ # ハンドラタイプに合致しない属性が指定された場合に
446
+ # エラーを出力できるよう、全ての属性をここで列挙する。
447
+
448
+ SETVAR_ADDR_ATTR = HandlerAttribute.new("setVariableAddress")
449
+ SETVAR_VALUE_ATTR = HandlerAttribute.new("setVariableValue")
450
+ INCVAR_ADDR_ATTR = HandlerAttribute.new("incrementedVariableAddress")
451
+ SNDDTQ_VALUE_ATTR = HandlerAttribute.new("dataqueueSentValue")
452
+ SETFLG_FLAG_ATTR = HandlerAttribute.new("flagPattern")
453
+
454
+ ATTRS = [
455
+ SETVAR_ADDR_ATTR,
456
+ SETVAR_VALUE_ATTR,
457
+ INCVAR_ADDR_ATTR,
458
+ SNDDTQ_VALUE_ATTR,
459
+ SETFLG_FLAG_ATTR
460
+ ]
461
+
462
+ # ------ ハンドラタイプの定義 -------
463
+
464
+ class BaseHandlerType
465
+ def initialize
466
+ super
467
+
468
+ # HandlerAttribute[]
469
+ @required_attributes = []
470
+ end
471
+
472
+ attr :required_attributes
473
+
474
+ #=== NotifierPlugin#BaseHandlerType#validate_join
475
+ # 指定したセルの結合先が、このハンドラタイプに該当するかを検証
476
+ # handler:: Handler : ハンドラ
477
+ # cell:: Cell : セル
478
+ # join:: Join : 結合 (declarationがPortであるもの)
479
+ def validate_join(handler, cell, join)
480
+ return !generate_attr_map(handler, cell).nil?
481
+ end
482
+
483
+ #=== NotifierPlugin#BaseHandlerType#generate_attr_map
484
+ # 指定したセルの属性と、既知のHandlerAttributeのマッピングを
485
+ # 生成し、Hash<HandlerAttribute, Join> (各属性とそれに対応する
486
+ # Join(declarationがDeclのもの)を表すHash)、あるいは、
487
+ # マッピングが行えない場合(属性の不足、過剰)はnilを返す。
488
+ #
489
+ # handler:: Handler : ハンドラ
490
+ # cell:: Cell : セル
491
+ def generate_attr_map(handler, cell)
492
+ map = {}
493
+
494
+ join_list = cell.get_join_list
495
+
496
+ ATTRS.each {|known_attr|
497
+ attr_name = known_attr.name_for_handler(handler)
498
+ join = join_list.get_item(attr_name.to_sym)
499
+
500
+ # このセルタイプにおいて必須の属性か?
501
+ is_required = @required_attributes.include?(known_attr)
502
+
503
+ # 属性の指定が不足している? or 過剰?
504
+ # 注: ハンドラタイプの判別には、セルで値が指定されているか
505
+ # が考慮される。セルタイプで初期値が指定されていても、
506
+ # それはハンドラタイプの決定に影響しない。
507
+ return nil if join.nil? != !is_required
508
+
509
+ # 必要のない属性であり、指定もされていないので飛ばす
510
+ next if join.nil?
511
+
512
+ # TODO: attrの結合であることを検証
513
+
514
+ map[known_attr] = join
515
+ }
516
+
517
+ return map
518
+ end
519
+
520
+ #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_type
521
+ # タイムイベントの通知の種類を表すコンフィギュレータの記述を生成し、Stringまたはnilを返す
522
+ # handler:: Handler : ハンドラ
523
+ def gen_cfg_handler_type(handler)
524
+ raise "called abstract method gen_cfg_handler_type"
525
+ end
526
+
527
+ #=== NotifierPlugin#BaseHandlerType#gen_cfg_handler_parameters
528
+ # タイムイベントの通知の引数を表すコンフィギュレータの記述を生成し、String[]を返す
529
+ # handler:: Handler : ハンドラ
530
+ # join:: Join : 結合 (declarationがPortであるもの)
531
+ # attrMap:: Hash<HandlerAttribute, Join> :
532
+ # 各属性とそれに対応するJoin (declarationがDeclのもの)
533
+ # cell:: Cell : セル
534
+ # adpt_gen:: AdapterGenerator : アダプタ関数を生成するオブジェクト
535
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
536
+ return nil
537
+ end
538
+
539
+ #=== NotifierPlugin#BaseHandlerType#might_fail
540
+ # 通知の際、エラーが発生し、その結果エラー通知を呼ぶ必要が生じる
541
+ # かどうかを返す。
542
+ def might_fail
543
+ return false
544
+ end
545
+ end
546
+ class BaseTaskHandlerType < BaseHandlerType
547
+ def validate_join(handler, cell, join, *args)
548
+ return super(handler, cell, join, *args) &&
549
+ join && join.get_rhs_cell.get_celltype.get_name == :tTask
550
+ end
551
+
552
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
553
+ taskCell = join.get_cell
554
+ id_attr_join = taskCell.get_join_list.get_item(:id)
555
+ id_attr = join.get_rhs_cell.get_celltype.find(:id)
556
+ if id_attr_join
557
+ # セル生成時に初期化する場合
558
+ id = id_attr_join.get_rhs.to_s
559
+ else
560
+ # セルタイプの初期化値を使う場合
561
+ id = id_attr.get_initializer.to_s
562
+ end
563
+
564
+ # $id$等の置換
565
+ name_array = taskCell.get_celltype.get_name_array(taskCell)
566
+ id = taskCell.get_celltype.subst_name(id, name_array)
567
+
568
+ return [id]
569
+ end
570
+
571
+ def might_fail
572
+ return true
573
+ end
574
+ end
575
+ class ActivateTaskHandlerType < BaseTaskHandlerType
576
+ def validate_join(handler, cell, join, *args)
577
+ return super(handler, cell, join, *args) &&
578
+ join.get_port_name == :eiActivateNotificationHandler
579
+ end
580
+
581
+ def gen_cfg_handler_type(handler)
582
+ case handler
583
+ when EVENT_HANDLER then return "TNFY_ACTTSK"
584
+ when ERROR_HANDLER then return "TENFY_ACTTSK"
585
+ else raise "unknown handler #{handler}"
586
+ end
587
+ end
588
+ end
589
+ class WakeUpTaskHandlerType < BaseTaskHandlerType
590
+ def validate_join(handler, cell, join, *args)
591
+ return super(handler, cell, join, *args) &&
592
+ join.get_port_name == :eiWakeUpNotificationHandler
593
+ end
594
+
595
+ def gen_cfg_handler_type(handler)
596
+ case handler
597
+ when EVENT_HANDLER then return "TNFY_WUPTSK"
598
+ when ERROR_HANDLER then return "TENFY_WUPTSK"
599
+ else raise "unknown handler #{handler}"
600
+ end
601
+ end
602
+ end
603
+ class SetVariableHandlerType < BaseHandlerType
604
+ def initialize
605
+ super
606
+ @required_attributes = [
607
+ SETVAR_ADDR_ATTR,
608
+ SETVAR_VALUE_ATTR
609
+ ] # .to_set
610
+ end
611
+
612
+ def validate_join(handler, cell, join, *args)
613
+ return super(handler, cell, join, *args) &&
614
+ join.nil? &&
615
+ handler == EVENT_HANDLER
616
+ end
617
+
618
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
619
+ var_addr = attrMap[SETVAR_ADDR_ATTR].get_rhs.to_s
620
+ var_value = attrMap[SETVAR_VALUE_ATTR].get_rhs.to_s
621
+
622
+ # $id$等の置換
623
+ name_array = cell.get_celltype.get_name_array(cell)
624
+ var_addr = cell.get_celltype.subst_name(var_addr, name_array)
625
+ var_value = cell.get_celltype.subst_name(var_value, name_array)
626
+
627
+ return [var_addr, var_value]
628
+ end
629
+
630
+ def gen_cfg_handler_type(handler)
631
+ case handler
632
+ when EVENT_HANDLER then return "TNFY_SETVAR"
633
+ else raise "unknown handler #{handler}"
634
+ end
635
+ end
636
+ end
637
+ class SetVariableToErrorCodeHandlerType < BaseHandlerType
638
+ def initialize
639
+ super
640
+ @required_attributes = [
641
+ SETVAR_ADDR_ATTR
642
+ ] # .to_set
643
+ end
644
+
645
+ def validate_join(handler, cell, join, *args)
646
+ return super(handler, cell, join, *args) &&
647
+ join.nil? &&
648
+ handler == ERROR_HANDLER
649
+ end
650
+
651
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
652
+ var_addr = attrMap[SETVAR_ADDR_ATTR].get_rhs.to_s
653
+
654
+ # $id$等の置換
655
+ name_array = cell.get_celltype.get_name_array(cell)
656
+ var_addr = cell.get_celltype.subst_name(var_addr, name_array)
657
+
658
+ return [var_addr]
659
+ end
660
+
661
+ def gen_cfg_handler_type(handler)
662
+ case handler
663
+ when ERROR_HANDLER then return "TENFY_SETVAR"
664
+ else raise "unknown handler #{handler}"
665
+ end
666
+ end
667
+ end
668
+ class IncrementVariableHandlerType < BaseHandlerType
669
+ def initialize
670
+ super
671
+ @required_attributes = [
672
+ INCVAR_ADDR_ATTR
673
+ ] # .to_set
674
+ end
675
+
676
+ def validate_join(handler, cell, join, *args)
677
+ return super(handler, cell, join, *args) &&
678
+ join.nil?
679
+ end
680
+
681
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
682
+ var_addr = attrMap[INCVAR_ADDR_ATTR].get_rhs.to_s
683
+
684
+ # $id$等の置換
685
+ name_array = cell.get_celltype.get_name_array(cell)
686
+ var_addr = cell.get_celltype.subst_name(var_addr, name_array)
687
+
688
+ return [var_addr]
689
+ end
690
+
691
+ def gen_cfg_handler_type(handler)
692
+ case handler
693
+ when EVENT_HANDLER then return "TNFY_INCVAR"
694
+ when ERROR_HANDLER then return "TENFY_INCVAR"
695
+ else raise "unknown handler #{handler}"
696
+ end
697
+ end
698
+ end
699
+ class SignalSemaphoreHandlerType < BaseHandlerType
700
+ def validate_join(handler, cell, join, *args)
701
+ return super(handler, cell, join, *args) &&
702
+ join && join.get_rhs_cell.get_celltype.get_name == :tSemaphore
703
+ end
704
+
705
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
706
+ semaphoreCell = join.get_cell
707
+ id_attr_join = semaphoreCell.get_join_list.get_item(:id)
708
+ id_attr = join.get_rhs_cell.get_celltype.find(:id)
709
+ if id_attr_join
710
+ # セル生成時に初期化する場合
711
+ id = id_attr_join.get_rhs.to_s
712
+ else
713
+ # セルタイプの初期化値を使う場合
714
+ id = id_attr.get_initializer.to_s
715
+ end
716
+
717
+ # $id$等の置換
718
+ name_array = semaphoreCell.get_celltype.get_name_array(semaphoreCell)
719
+ id = semaphoreCell.get_celltype.subst_name(id, name_array)
720
+
721
+ return [id]
722
+ end
723
+
724
+ def might_fail
725
+ return true
726
+ end
727
+
728
+ def gen_cfg_handler_type(handler)
729
+ case handler
730
+ when EVENT_HANDLER then return "TNFY_SIGSEM"
731
+ when ERROR_HANDLER then return "TENFY_SIGSEM"
732
+ else raise "unknown handler #{handler}"
733
+ end
734
+ end
735
+ end
736
+ class SetEventflagHandlerType < BaseHandlerType
737
+ def initialize
738
+ super
739
+ @required_attributes = [
740
+ SETFLG_FLAG_ATTR
741
+ ] # .to_set
742
+ end
743
+
744
+ def validate_join(handler, cell, join, *args)
745
+ return super(handler, cell, join, *args) &&
746
+ join && join.get_rhs_cell.get_celltype.get_name == :tEventflag
747
+ end
748
+
749
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
750
+ eventflagCell = join.get_cell
751
+ id_attr_join = eventflagCell.get_join_list.get_item(:id)
752
+ id_attr = join.get_rhs_cell.get_celltype.find(:id)
753
+ if id_attr_join
754
+ # セル生成時に初期化する場合
755
+ id = id_attr_join.get_rhs.to_s
756
+ else
757
+ # セルタイプの初期化値を使う場合
758
+ id = id_attr.get_initializer.to_s
759
+ end
760
+ flg_pattern = attrMap[SETFLG_FLAG_ATTR].get_rhs.to_s
761
+
762
+ # $id$等の置換
763
+ name_array = eventflagCell.get_celltype.get_name_array(eventflagCell)
764
+ id = eventflagCell.get_celltype.subst_name(id, name_array)
765
+
766
+ name_array = cell.get_celltype.get_name_array(cell)
767
+ flg_pattern = cell.get_celltype.subst_name(flg_pattern, name_array)
768
+
769
+ return [id, flg_pattern]
770
+ end
771
+
772
+ def might_fail
773
+ return true
774
+ end
775
+
776
+ def gen_cfg_handler_type(handler)
777
+ case handler
778
+ when EVENT_HANDLER then return "TNFY_SETFLG"
779
+ when ERROR_HANDLER then return "TENFY_SETFLG"
780
+ else raise "unknown handler #{handler}"
781
+ end
782
+ end
783
+ end
784
+ class DataqueueHandlerType < BaseHandlerType
785
+ def initialize
786
+ super
787
+ end
788
+
789
+ def validate_join(handler, cell, join, *args)
790
+ return super(handler, cell, join, *args) &&
791
+ join && join.get_rhs_cell.get_celltype.get_name == :tDataqueue
792
+ end
793
+
794
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
795
+ dataqueueCell = join.get_cell
796
+ id_attr_join = dataqueueCell.get_join_list.get_item(:id)
797
+ id_attr = join.get_rhs_cell.get_celltype.find(:id)
798
+ if id_attr_join
799
+ # セル生成時に初期化する場合
800
+ id = id_attr_join.get_rhs.to_s
801
+ else
802
+ # セルタイプの初期化値を使う場合
803
+ id = id_attr.get_initializer.to_s
804
+ end
805
+
806
+ # $id$等の置換
807
+ name_array = dataqueueCell.get_celltype.get_name_array(dataqueueCell)
808
+ id = dataqueueCell.get_celltype.subst_name(id, name_array)
809
+
810
+ name_array = cell.get_celltype.get_name_array(cell)
811
+
812
+ return [id]
813
+ end
814
+
815
+ def might_fail
816
+ return true
817
+ end
818
+ end
819
+ class SendToDataqueueHandlerType < DataqueueHandlerType
820
+ def initialize
821
+ super
822
+ @required_attributes = [
823
+ SNDDTQ_VALUE_ATTR
824
+ ] # .to_set
825
+ end
826
+
827
+ def validate_join(handler, cell, join, *args)
828
+ return super(handler, cell, join, *args) && handler == EVENT_HANDLER
829
+ end
830
+
831
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
832
+ params = super(handler, join, attrMap, cell, adpt_gen)
833
+
834
+ sent_value = attrMap[SNDDTQ_VALUE_ATTR].get_rhs.to_s
835
+
836
+ # $id$等の置換
837
+ name_array = cell.get_celltype.get_name_array(cell)
838
+ sent_value = cell.get_celltype.subst_name(sent_value, name_array)
839
+
840
+ params << sent_value
841
+
842
+ return params
843
+ end
844
+
845
+ def gen_cfg_handler_type(handler)
846
+ case handler
847
+ when EVENT_HANDLER then return "TNFY_SNDDTQ"
848
+ else raise "unknown handler #{handler}"
849
+ end
850
+ end
851
+ end
852
+ class SendErrorCodeToDataqueueHandlerType < DataqueueHandlerType
853
+ def initialize
854
+ super
855
+ end
856
+
857
+ def validate_join(handler, cell, join, *args)
858
+ return super(handler, cell, join, *args) && handler == ERROR_HANDLER
859
+ end
860
+
861
+ def gen_cfg_handler_type(handler)
862
+ case handler
863
+ when ERROR_HANDLER then return "TENFY_SNDDTQ"
864
+ else raise "unknown handler #{handler}"
865
+ end
866
+ end
867
+ end
868
+ class UserHandlerType < BaseHandlerType
869
+ def validate_join(handler, cell, join, *args)
870
+ return super(handler, cell, join, *args) &&
871
+ handler != ERROR_HANDLER && # invalid for error handler
872
+ join && join.get_rhs_cell.get_celltype.get_name == :tTimeEventHandler
873
+ end
874
+
875
+ def gen_cfg_handler_type(handler)
876
+ case handler
877
+ when EVENT_HANDLER then return "TNFY_HANDLER"
878
+ else raise "unknown handler #{handler}"
879
+ end
880
+ end
881
+
882
+ def gen_cfg_handler_parameters(handler, join, attrMap, cell, adpt_gen)
883
+ # tTimeEventHandlerの結合先を取得
884
+ handler_cell = join.get_rhs_cell
885
+ call_join = handler_cell.get_join_list.get_item(:ciHandlerBody)
886
+
887
+ # 結合されていない場合はtecsgenがエラーを出すはずなのでここでは
888
+ # エラーにせず無視する.
889
+ return [] unless call_join
890
+
891
+ # アダプタ関数ハンドルを取得
892
+ adapter_handle = adpt_gen.make_adapter_handle(call_join)
893
+ return [adapter_handle[1], adapter_handle[0]]
894
+ end
895
+ end
896
+ class NullHandlerType < BaseHandlerType
897
+ def validate_join(handler, cell, join, *args)
898
+ return super(handler, cell, join, *args) &&
899
+ join.nil? &&
900
+ handler != EVENT_HANDLER # handler is mandatory for normal handler!
901
+ end
902
+
903
+ def gen_cfg_handler_type(handler)
904
+ case handler
905
+ when ERROR_HANDLER then return nil
906
+ else raise "unknown handler #{handler}"
907
+ end
908
+ end
909
+ end
910
+
911
+ HANDLER_TYPES = [
912
+ ActivateTaskHandlerType.new,
913
+ WakeUpTaskHandlerType.new,
914
+ SetVariableHandlerType.new,
915
+ SetVariableToErrorCodeHandlerType.new,
916
+ IncrementVariableHandlerType.new,
917
+ SignalSemaphoreHandlerType.new,
918
+ SetEventflagHandlerType.new,
919
+ SendToDataqueueHandlerType.new,
920
+ SendErrorCodeToDataqueueHandlerType.new,
921
+ UserHandlerType.new,
922
+ NullHandlerType.new
923
+ ]
924
+
925
+ # @celltype:: Celltype
926
+ # @option:: String :オプション文字列
927
+ def initialize(celltype, option)
928
+ super
929
+ @plugin_arg_check_proc_tab = NotifierPluginArgProc
930
+ @plugin_arg_str = option
931
+ @plugin_arg_str = option.gsub(/\A"(.*)/, '\1') # 前後の "" を取り除く
932
+ @plugin_arg_str.sub!(/(.*)"\z/, '\1')
933
+ @factory = nil
934
+ @output_file = nil
935
+ parse_plugin_arg
936
+ unless @factory
937
+ cdl_error("NTF1003 celltype $1: option factory is not specified",
938
+ celltype.get_name)
939
+ end
940
+ unless @output_file
941
+ cdl_error("NTF1003 celltype $1: option output_file is not specified",
942
+ celltype.get_name)
943
+ end
944
+ end
945
+
946
+ def set_factory(template_string)
947
+ unless @factory.nil?
948
+ cdl_error("NTF1003 celltype $1: option factory was specified more than once",
949
+ celltype.get_name)
950
+ end
951
+ @factory = template_string
952
+ end
953
+
954
+ def set_factory_output_file(output_file)
955
+ unless @output_file.nil?
956
+ cdl_error("NTF1003 celltype $1: option output_file was specified more than once",
957
+ celltype.get_name)
958
+ end
959
+ @output_file = output_file
960
+ end
961
+
962
+ def gen_factory(file)
963
+ # puts "===== begin #{@celltype.get_name.to_s} plugin ====="
964
+
965
+ kernelCfg = AppFile.open("#{$gen}/#{@output_file}")
966
+ kernelCfg.print "\n/* Generated by #{self.class.name} */\n"
967
+ kernelCfg.print "\#include \"tTimeEventHandler.h\"\n"
968
+
969
+ # アダプタ関数を生成する準備
970
+ @adpt_gen = AdapterGenerator.new("tTimeEventHandler", @celltype.get_global_name)
971
+
972
+ # 属性置換が行えることを検証する。
973
+ # ここで行うのは、factoryで指定された属性名が
974
+ # 存在することを確認し、しなければエラーを出力することのみである。
975
+ # セルごとの処理の最中にエラーを出力することも可能ではあるが、
976
+ # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
977
+ # エラーが表示されてしまう。
978
+ # {{attribute_name}} -> attribute_value
979
+ @factory.scan(/\{\{([a-zA-Z0-9_]*?)\}\}/) {|match|
980
+ name = $1.to_sym
981
+
982
+ # {{_handler_params_}} はハンドラに関する指定。プラグイン内で値が生成される
983
+ next if name == :_handler_params_
984
+
985
+ subst_attr = @celltype.find(name)
986
+ unless subst_attr
987
+ cdl_error("NTF1007 celltype $1: additional_param: attribute $2 does not exist.",
988
+ @celltype.get_name, name)
989
+ end
990
+ }
991
+
992
+ @celltype.get_cell_list.each {|cell|
993
+ gen_factory_for_cell kernelCfg, cell
994
+ }
995
+
996
+ # アダプタ関数の生成を完了させる
997
+ @adpt_gen.finish
998
+
999
+ kernelCfg.close
1000
+ # puts "===== end #{@celltype.get_name.to_s} plugin ====="
1001
+ end
1002
+
1003
+ def gen_factory_for_cell(kernelCfg, cell)
1004
+ # print "########## gen_factory_for_cell cell=#{cell.get_name}\n"
1005
+ handler_flags = []
1006
+ handler_args = []
1007
+
1008
+ event_handler_might_fail = true
1009
+ handler_flag = nil
1010
+
1011
+ # ignoreErrorsを取得
1012
+ ignoreErrors_attr_join = cell.get_join_list.get_item(:ignoreErrors)
1013
+ ignoreErrors_attr = cell.get_celltype.find(:ignoreErrors)
1014
+ if ignoreErrors_attr_join
1015
+ # セル生成時に初期化する場合
1016
+ ignoreErrors = ignoreErrors_attr_join.get_rhs.to_s
1017
+ else
1018
+ # セルタイプの初期化値を使う場合
1019
+ ignoreErrors = ignoreErrors_attr.get_initializer.to_s
1020
+ end
1021
+ case ignoreErrors
1022
+ when "true" then ignoreErrors = true
1023
+ when "false" then ignoreErrors = false
1024
+ else
1025
+ cdl_warning2(cell.get_locale, "NTF1005 cell $1: unrecognized value '$2' specified for ignoreErrors",
1026
+ cell.get_name, ignoreErrors)
1027
+ ignoreErrors = false
1028
+ end
1029
+
1030
+ # ドメイン指定用文字列
1031
+ pre_text = ""
1032
+ post_text = "\n"
1033
+ indent = ""
1034
+
1035
+ [EVENT_HANDLER, ERROR_HANDLER].each {|handler|
1036
+ # 呼び口の結合を取得
1037
+ call_join = cell.get_join_list.get_item(handler.call_port_name.to_sym)
1038
+ domain_root = cell.get_region.get_domain_root
1039
+ if cell.get_region.get_domain_root.get_domain_type
1040
+ # print "cell=#{cell.get_name} domain_root=#{domain_root.get_name} domain_type=#{domain_root.get_domain_type.get_name} domain_option=#{domain_root.get_domain_type.get_option}\n"
1041
+ else
1042
+ # print "cell=#{cell.get_name} domain_root=#{cell.get_region.get_domain_root.get_name}\n"
1043
+ end
1044
+ if call_join
1045
+ # print "validate_join: hanlder=#{handler.class.name} cell=#{cell.get_name} join=#{call_join.get_name} rhs_cell=#{call_join.get_cell}\n"
1046
+ else
1047
+ # print "validate_join: hanlder=#{handler.class.name} cell=#{cell.get_name}\n"
1048
+ end
1049
+
1050
+ # ハンドラタイプを判別する
1051
+ matches = HANDLER_TYPES.select {|handler_type|
1052
+ handler_type.validate_join(handler, cell, call_join)
1053
+ }
1054
+
1055
+ if matches.length == 0
1056
+ cdl_error2(cell.get_locale, "NTF1001 cell $1: no matching handler type found for $2", cell.get_name, handler.call_port_name)
1057
+ next
1058
+ end
1059
+
1060
+ # 最初に見つかった有効なハンドラタイプを使用
1061
+ ht = matches[0]
1062
+
1063
+ # ドメインプラグインが指定されている場合、所属ドメインのチェック
1064
+ domain_root = cell.get_region.get_domain_root
1065
+ if domain_root.get_domain_type
1066
+ if domain_root.get_domain_type.get_name == :HRP
1067
+ option = domain_root.get_domain_type.get_option
1068
+ matches.each{|match|
1069
+ # p "match:#{match}"
1070
+ case match
1071
+ when ActivateTaskHandlerType, WakeUpTaskHandlerType,
1072
+ SetVariableHandlerType, SetVariableToErrorCodeHandlerType,
1073
+ IncrementVariableHandlerType, SignalSemaphoreHandlerType,
1074
+ SetEventflagHandlerType, SendToDataqueueHandlerType,
1075
+ SendErrorCodeToDataqueueHandlerType
1076
+ if option == "OutOfDomain"
1077
+ cdl_error2(cell.get_locale, "NTF9999: NotifierPlugin: $1 cannot be placed out of domain", cell.get_name)
1078
+ elsif call_join.get_cell.get_region.get_domain_root.nil? ||
1079
+ call_join.get_cell.get_region.get_domain_root != domain_root
1080
+ cdl_error2(cell.get_locale, "NTF9999: NotifierPlugin: $1 and $2 must be placed in same domain", cell.get_name, call_join.get_cell.get_name)
1081
+ end
1082
+ dbgPrint "#{self.class.name}: match pattern 1.\n"
1083
+ when UserHandlerType
1084
+ if option != "kernel"
1085
+ cdl_error2(cell.get_locale, "NTF9999: NotifierPlugin: $1 can be placed in kernel domain only, because notify target is handler", cell.get_name)
1086
+ elsif call_join.get_cell.get_region.get_domain_root.nil? ||
1087
+ call_join.get_cell.get_region.get_domain_root != domain_root
1088
+ cdl_error2(cell.get_locale, "NTF9999: NotifierPlugin: $1 and $2 must be placed in same domain", cell.get_name, call_join.get_cell.get_name)
1089
+ end
1090
+ dbgPrint "#{self.class.name}: match pattern 2.\n"
1091
+ when NullHandlerType.new # エラー通知を指定していない
1092
+ dbgPrint "#{self.class.name}: match pattern 3.\n"
1093
+ end
1094
+ }
1095
+
1096
+ # if cell.get_region.get_param == :KERNEL_DOMAIN
1097
+ if option == "kernel"
1098
+ pre_text = "KERNEL_DOMAIN{\n"
1099
+ post_text = "}\n"
1100
+ indent = "\t"
1101
+ elsif option != "OutOfDomain"
1102
+ pre_text = "DOMAIN(#{domain_root.get_name}){\n"
1103
+ post_text = "}\n"
1104
+ indent = "\t"
1105
+ end
1106
+ else
1107
+ cdl_error("NTF9999: NotifierPlugin: unknown domain type $1", domain_root.get_domain_type.get_name)
1108
+ end
1109
+
1110
+ end
1111
+
1112
+ # 通知ハンドラで「エラーが発生するはずがない」のに「エラーハンドラが指定されている」
1113
+ # もしくはその逆のパターンを検出する。
1114
+ # (handler_flagがnilである場合、ハンドラタイプが不明であり、エラーが発生するか不明
1115
+ # なため、検出は行わない。)
1116
+ if handler == ERROR_HANDLER && !ht.is_a?(NullHandlerType) && !event_handler_might_fail
1117
+ cdl_error2(cell.get_locale, "NTF1004 cell $1: handler type $2 which never raises an error was inferred for the normal notification handler, but an error notification handler was specified.",
1118
+ cell.get_name, handler_flag)
1119
+ end
1120
+ if handler == ERROR_HANDLER && ht.is_a?(NullHandlerType) && event_handler_might_fail && !ignoreErrors
1121
+ cdl_warning2(cell.get_locale, "NTF1006 cell $1: handler type $2 which might raise an error was inferred for the normal notificaton handler, but an error notification handler was not specified.",
1122
+ cell.get_name, handler_flag)
1123
+ end
1124
+
1125
+ # assertion
1126
+ unless ht.validate_join(handler, cell, call_join)
1127
+ raise "!validate_join"
1128
+ end
1129
+
1130
+ # 通知方法の静的API記述を生成する
1131
+ handler_flag = ht.gen_cfg_handler_type(handler)
1132
+ handler_flags << handler_flag if handler_flag
1133
+
1134
+ attr_map = ht.generate_attr_map(handler, cell)
1135
+
1136
+ handler_arg = ht.gen_cfg_handler_parameters(handler, call_join, attr_map, cell, @adpt_gen)
1137
+ handler_args += handler_arg if handler_arg
1138
+
1139
+ if handler == EVENT_HANDLER
1140
+ event_handler_might_fail = ht.might_fail
1141
+ end
1142
+ }
1143
+
1144
+ # $id$等の置換
1145
+ name_array = cell.get_celltype.get_name_array(cell)
1146
+ handler_args.collect! {|e|
1147
+ if e == "$cbp$"
1148
+ cell.get_celltype.subst_name(e, name_array)
1149
+ else
1150
+ e
1151
+ end
1152
+ }
1153
+
1154
+ # tecsgen.cfgの記述を生成する。
1155
+ # factoryに対し、パラメータ置換を行う。
1156
+ # {{attribute_name}} -> attribute_value
1157
+ text = @factory.gsub(/\{\{([a-zA-Z0-9_]*?)\}\}/) {|match|
1158
+ name = $1.to_sym
1159
+ subst_attr = cell.get_celltype.find(name)
1160
+
1161
+ # {{_handler_params_}} はハンドラの指定に置換する。
1162
+ if name == :_handler_params_
1163
+ args_joined = handler_flags.join(" | ")
1164
+ if handler_args.length > 0
1165
+ args_joined << ", "
1166
+ args_joined << handler_args.join(", ")
1167
+ end
1168
+ next args_joined
1169
+ end
1170
+
1171
+ unless subst_attr
1172
+ # 属性が見つからないというエラーはすでに報告されているので
1173
+ # ここではダミー値を返しておくだけである。
1174
+ next ""
1175
+ end
1176
+
1177
+ subst_attr_join = cell.get_join_list.get_item(name)
1178
+ if subst_attr_join
1179
+ # セル生成時に初期化する場合
1180
+ subst = subst_attr_join.get_rhs.to_s
1181
+ else
1182
+ # セルタイプの初期化値を使う場合
1183
+ subst = subst_attr.get_initializer.to_s
1184
+ end
1185
+
1186
+ # $id$等の置換
1187
+ cell.get_celltype.subst_name(subst, name_array)
1188
+ }
1189
+
1190
+ # 出力 (CRE_xxx)
1191
+ kernelCfg.print pre_text
1192
+ kernelCfg.print indent, text, "\n"
1193
+ gen_sac kernelCfg, cell, indent
1194
+ kernelCfg.print post_text
1195
+ end
1196
+
1197
+ def gen_sac(file, cell, indent)
1198
+ domain_root = cell.get_region.get_domain_root
1199
+ if domain_root.get_domain_type
1200
+ id = (cell.get_attr_initializer :id).to_s
1201
+ name_array = cell.get_celltype.get_name_array(cell)
1202
+ case cell.get_celltype.get_name
1203
+ when :tCyclicNotifier
1204
+ obj_type = "CYC"
1205
+ when :tAlarmNotifier
1206
+ obj_type = "ALM"
1207
+ else
1208
+ raise "NotifierPlugin: unknown celltype #{cell.get_celltype.get_name}"
1209
+ end
1210
+ id = cell.get_celltype.subst_name(id, name_array)
1211
+ # p obj_type
1212
+ # p HRPPlugin.get_sac_str cell
1213
+ file.print indent, "SAC_#{obj_type}( #{id}, #{HRPPlugin.get_sac_str cell} );\n"
1214
+ end
1215
+ end
1216
+ private :gen_factory_for_cell
1217
+ end