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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rubocop.yml +125 -0
- data/.rubocop_todo.yml +188 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE +46 -0
- data/LICENSE.ja +32 -0
- data/README.ja.md +200 -0
- data/README.md +35 -0
- data/Rakefile +27 -0
- data/bin/tecscde +64 -0
- data/glade/tecscde-cell-property.glade +205 -0
- data/glade/tecscde-celltype-property.glade +172 -0
- data/glade/tecscde-celltype.glade +414 -0
- data/glade/tecscde-export.glade +161 -0
- data/glade/test-cell-plugin.rb +51 -0
- data/glade/test-cell-property.rb +35 -0
- data/glade/test-export.rb +35 -0
- data/glade/test-palette.rb +26 -0
- data/lib/tcflow.rb +148 -0
- data/lib/tecscde.rb +65 -0
- data/lib/tecscde/NewCell.png +0 -0
- data/lib/tecscde/SelectArrow.png +0 -0
- data/lib/tecscde/attr_tree_view.rb +253 -0
- data/lib/tecscde/cell_plugin_dialog.glade +294 -0
- data/lib/tecscde/cell_plugin_dialog.rb +89 -0
- data/lib/tecscde/celltype_tree_view.rb +105 -0
- data/lib/tecscde/change_set_control.rb +35 -0
- data/lib/tecscde/change_set_control/change_set.rb +32 -0
- data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
- data/lib/tecscde/command.rb +35 -0
- data/lib/tecscde/control.rb +491 -0
- data/lib/tecscde/highlighted_objects.rb +180 -0
- data/lib/tecscde/logger.rb +74 -0
- data/lib/tecscde/main_view_and_model.rb +80 -0
- data/lib/tecscde/palette.glade +553 -0
- data/lib/tecscde/palette.rb +174 -0
- data/lib/tecscde/preferences.glade +117 -0
- data/lib/tecscde/preferences.rb +44 -0
- data/lib/tecscde/tecs_model.rb +1137 -0
- data/lib/tecscde/tecs_model/hbar.rb +68 -0
- data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
- data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
- data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
- data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
- data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
- data/lib/tecscde/tecs_model/tm_join.rb +293 -0
- data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
- data/lib/tecscde/tecs_model/tm_port.rb +238 -0
- data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
- data/lib/tecscde/tecs_model/tm_region.rb +107 -0
- data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
- data/lib/tecscde/tecs_model/vbar.rb +68 -0
- data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
- data/lib/tecscde/templates/_join_info.cde.erb +28 -0
- data/lib/tecscde/templates/main.cde.erb +49 -0
- data/lib/tecscde/tm_object.rb +91 -0
- data/lib/tecscde/version.rb +4 -0
- data/lib/tecscde/view.rb +58 -0
- data/lib/tecscde/view/cairo_matrix.rb +90 -0
- data/lib/tecscde/view/canvas.rb +59 -0
- data/lib/tecscde/view/constants.rb +114 -0
- data/lib/tecscde/view/main_view.rb +1245 -0
- data/lib/tecsflow.rb +475 -0
- data/lib/tecsflow/C_parser.tab.rb +2471 -0
- data/lib/tecsflow/C_parser.y.rb +1087 -0
- data/lib/tecsflow/classes.rb +421 -0
- data/lib/tecsgen.rb +581 -0
- data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
- data/lib/tecsgen/core/C_parser.y +1032 -0
- data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.y +2211 -0
- data/lib/tecsgen/core/componentobj.rb +7901 -0
- data/lib/tecsgen/core/ctypes.rb +226 -0
- data/lib/tecsgen/core/expression.rb +1031 -0
- data/lib/tecsgen/core/gen_xml.rb +374 -0
- data/lib/tecsgen/core/generate.rb +5206 -0
- data/lib/tecsgen/core/location.rb +116 -0
- data/lib/tecsgen/core/messages.rb +101 -0
- data/lib/tecsgen/core/optimize.rb +456 -0
- data/lib/tecsgen/core/plugin.rb +332 -0
- data/lib/tecsgen/core/pluginModule.rb +165 -0
- data/lib/tecsgen/core/syntaxobj.rb +1234 -0
- data/lib/tecsgen/core/tecs_lang.rb +306 -0
- data/lib/tecsgen/core/tecsgen.rb +453 -0
- data/lib/tecsgen/core/tecsinfo.rb +860 -0
- data/lib/tecsgen/core/tool_info.rb +258 -0
- data/lib/tecsgen/core/types.rb +1632 -0
- data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
- data/lib/tecsgen/core/value.rb +650 -0
- data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
- data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
- data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
- data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
- data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
- data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
- data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
- data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
- data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
- data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
- data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
- data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
- data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
- data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
- data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
- data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
- data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
- data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
- data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
- data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
- data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
- data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
- data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
- data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
- data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
- data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
- data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
- data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
- data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
- data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
- data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
- data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
- data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
- data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
- data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
- data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
- data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
- data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
- data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
- data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
- data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
- data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
- data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
- data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
- data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
- data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
- data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
- data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
- data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
- data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
- data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
- data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
- data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
- data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
- data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
- data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
- data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
- data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
- data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
- data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
- data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
- data/lib/tecsgen/version.rb +6 -0
- data/samples/FigureSamples/active/active.cde +104 -0
- data/samples/FigureSamples/active/active.cdl +20 -0
- data/samples/FigureSamples/active/active.pdf +0 -0
- data/samples/FigureSamples/active/active.png +0 -0
- data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
- data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
- data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
- data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
- data/samples/FigureSamples/allocator/allocator.cde +171 -0
- data/samples/FigureSamples/allocator/allocator.cdl +58 -0
- data/samples/FigureSamples/allocator/allocator.png +0 -0
- data/samples/FigureSamples/basic/Makefile +87 -0
- data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
- data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
- data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
- data/samples/FigureSamples/basic/basic.cde +93 -0
- data/samples/FigureSamples/basic/basic.cdl +46 -0
- data/samples/FigureSamples/basic/basic.png +0 -0
- data/samples/FigureSamples/callback/callback.cde +130 -0
- data/samples/FigureSamples/callback/callback.cdl +29 -0
- data/samples/FigureSamples/callback/callback.png +0 -0
- data/samples/FigureSamples/carray/carray.cde +144 -0
- data/samples/FigureSamples/carray/carray.cdl +38 -0
- data/samples/FigureSamples/carray/carray.png +0 -0
- data/samples/FigureSamples/cearray/cearray.cde +314 -0
- data/samples/FigureSamples/cearray/cearray.cdl +60 -0
- data/samples/FigureSamples/cearray/cearray.png +0 -0
- data/samples/FigureSamples/composite/composite-internal.png +0 -0
- data/samples/FigureSamples/composite/composite.cde +216 -0
- data/samples/FigureSamples/composite/composite.cdl +95 -0
- data/samples/FigureSamples/composite/composite.png +0 -0
- data/samples/FigureSamples/earray/earray.cde +142 -0
- data/samples/FigureSamples/earray/earray.cdl +38 -0
- data/samples/FigureSamples/earray/earray.png +0 -0
- data/samples/FigureSamples/join/Makefile +87 -0
- data/samples/FigureSamples/join/join.cde +132 -0
- data/samples/FigureSamples/join/join.cdl +40 -0
- data/samples/FigureSamples/join/join.png +0 -0
- data/samples/FigureSamples/relay/Makefile +99 -0
- data/samples/FigureSamples/relay/relay-internal.png +0 -0
- data/samples/FigureSamples/relay/relay.cde +284 -0
- data/samples/FigureSamples/relay/relay.cdl +52 -0
- data/samples/FigureSamples/relay/relay.png +0 -0
- data/samples/FigureSamples/rpc/Makefile +123 -0
- data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
- data/samples/FigureSamples/rpc/rpc.cde +245 -0
- data/samples/FigureSamples/rpc/rpc.png +0 -0
- data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
- data/samples/SimpleSample/Makefile +25 -0
- data/samples/SimpleSample/SimpleSample/Makefile +86 -0
- data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSample/README.txt +106 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
- data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
- data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
- data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
- data/tecscde.gemspec +41 -0
- metadata +353 -0
|
@@ -0,0 +1,116 @@
|
|
|
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: location.rb 2640 2017-06-03 11:27:12Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
class TECSGEN
|
|
40
|
+
#------ manupulate location information --------#
|
|
41
|
+
def self.new_cell_location(cell_location)
|
|
42
|
+
@@current_tecsgen.new_cell_location cell_location
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def new_cell_location(cell_location)
|
|
46
|
+
@cell_location_list << cell_location
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get_cell_location_list
|
|
50
|
+
@cell_location_list
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.new_join_location(join_location)
|
|
54
|
+
@@current_tecsgen.new_join_location join_location
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def new_join_location(join_location)
|
|
58
|
+
@join_location_list << join_location
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_join_location_list
|
|
62
|
+
@join_location_list
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#== Cell_location
|
|
66
|
+
# tecscde の位置情報
|
|
67
|
+
class Cell_location
|
|
68
|
+
#=== Join_location#initialize
|
|
69
|
+
# cell_nspath::NamespacePath
|
|
70
|
+
# x,y,w,h::Expression
|
|
71
|
+
# port_location_list::[ [Symbol(ep_or_cp_name), Symbol(edge_name), Expression(offset)], ... ]
|
|
72
|
+
# ep_name::Symbol
|
|
73
|
+
def initialize(cell_nspath, x, y, w, h, port_location_list)
|
|
74
|
+
# p "Cell_location: #{cell_nspath}, #{x}, #{y}, #{w}, #{h}, #{port_location_list}"
|
|
75
|
+
@cell_nspath = cell_nspath
|
|
76
|
+
@x = x.eval_const nil
|
|
77
|
+
@y = y.eval_const nil
|
|
78
|
+
@w = w.eval_const nil
|
|
79
|
+
@h = h.eval_const nil
|
|
80
|
+
@port_location_list = port_location_list
|
|
81
|
+
|
|
82
|
+
TECSGEN.new_cell_location self
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def get_location
|
|
86
|
+
[@cell_nspath, @x, @y, @w, @h, @port_location_list]
|
|
87
|
+
end
|
|
88
|
+
end # Cell_location
|
|
89
|
+
|
|
90
|
+
#== Join_location
|
|
91
|
+
# tecscde の位置情報
|
|
92
|
+
class Join_location
|
|
93
|
+
@@join_location_list = []
|
|
94
|
+
|
|
95
|
+
#=== Join_location#initialize
|
|
96
|
+
# cp_cell_nspath::NamespacePath
|
|
97
|
+
# cp_name::Symbol
|
|
98
|
+
# ep_cell_nspath::NamespacePath
|
|
99
|
+
# ep_name::Symbol
|
|
100
|
+
# bar_list::[[Symbol (VBar or HBar), Expression(position mm)], ....]
|
|
101
|
+
def initialize(cp_cell_nspath, cp_name, ep_cell_path, ep_name, bar_list)
|
|
102
|
+
# p "Join_location #{cp_cell_nspath}, #{cp_name}, #{ep_cell_path}, #{ep_name} #{bar_list}"
|
|
103
|
+
@cp_cell_nspath = cp_cell_nspath
|
|
104
|
+
@cp_name = cp_name
|
|
105
|
+
@ep_cell_path = ep_cell_path
|
|
106
|
+
@ep_name = ep_name
|
|
107
|
+
@bar_list = bar_list
|
|
108
|
+
|
|
109
|
+
TECSGEN.new_join_location self
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def get_location
|
|
113
|
+
[@cp_cell_nspath, @cp_name, @ep_cell_path, @ep_name, @bar_list]
|
|
114
|
+
end
|
|
115
|
+
end # Join_location
|
|
116
|
+
end # TECSGEN
|
|
@@ -0,0 +1,101 @@
|
|
|
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: messages.rb 2633 2017-04-02 06:02:05Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
#== TECS の生成する各国語化必要な文字列
|
|
40
|
+
# 現状、エラーメッセージは英語のみ
|
|
41
|
+
# 生成ファイルのコメントとして出力される文字列
|
|
42
|
+
class TECSMsg
|
|
43
|
+
#=== TECSMsg#生成するヘッダやテンプレートなどに含めるコメントの取得
|
|
44
|
+
# CDL の文字コードに合わせて、文字コード変換を行う
|
|
45
|
+
def self.get(msg)
|
|
46
|
+
str = @@comment[msg]
|
|
47
|
+
if $ENCODING_TECSGEN == $ENCODING_CDL || $ENCODING_CDL == Encoding::BINARY
|
|
48
|
+
return str
|
|
49
|
+
else
|
|
50
|
+
return str.encode($ENCODING_CDL)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#=== TECSMsg#ローカライズされたエラーメッセージを得る
|
|
55
|
+
# body::String : "S0001 error message body" の形式
|
|
56
|
+
# S0001 の部分が使用される
|
|
57
|
+
# Generator.error2 から呼び出される
|
|
58
|
+
def self.get_error_message(body)
|
|
59
|
+
body =~ /^[A-Z0-9]+/ # エラー番号を取り出す
|
|
60
|
+
num = $&
|
|
61
|
+
if num
|
|
62
|
+
msg = @@error_message[num.to_sym]
|
|
63
|
+
else
|
|
64
|
+
msg = nil
|
|
65
|
+
end
|
|
66
|
+
if msg.nil?
|
|
67
|
+
m = body
|
|
68
|
+
else
|
|
69
|
+
m = num + " " + msg
|
|
70
|
+
end
|
|
71
|
+
return m
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#=== TECSMsg#ローカライズされたウォーニングメッセージを得る
|
|
75
|
+
# Generator.warning2 から呼び出される
|
|
76
|
+
def self.get_warning_message(body)
|
|
77
|
+
body =~ /^[A-Z0-9]+/ # ウォーニング番号を取り出す
|
|
78
|
+
num = $&
|
|
79
|
+
msg = @@warning_message[num.to_sym]
|
|
80
|
+
if msg.nil?
|
|
81
|
+
m = body
|
|
82
|
+
else
|
|
83
|
+
m = num + " " + msg
|
|
84
|
+
end
|
|
85
|
+
return m
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#=== TECSMsg#ローカライズされた情報メッセージを得る
|
|
89
|
+
# Generator.info2 から呼び出される
|
|
90
|
+
def self.get_info_message(body)
|
|
91
|
+
body =~ /^[A-Z0-9]+/ # 情報番号を取り出す
|
|
92
|
+
num = $&
|
|
93
|
+
msg = @@info_message[num.to_sym]
|
|
94
|
+
if msg.nil?
|
|
95
|
+
m = body
|
|
96
|
+
else
|
|
97
|
+
m = num + " " + msg
|
|
98
|
+
end
|
|
99
|
+
return m
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
#
|
|
2
|
+
# TECS Generator
|
|
3
|
+
# Generator for TOPPERS Embedded Component System
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2008-2018 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: optimize.rb 2831 2018-03-18 06:16:30Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
=begin
|
|
40
|
+
This file includes the processes between semantics analysis and code generation.
|
|
41
|
+
Optimize is one of them.
|
|
42
|
+
Other processes are setting ID for each cell and setting domain information
|
|
43
|
+
|
|
44
|
+
このファイルには、意味解析からコード生成の間で行うべき処理が含まれる.
|
|
45
|
+
最適化もその一つである.
|
|
46
|
+
その他に、セル毎の ID 付け、ドメインわけを行う.
|
|
47
|
+
コード生成対象となるセルを対象に処理を行うものが含まれる.
|
|
48
|
+
=end
|
|
49
|
+
|
|
50
|
+
class Namespace
|
|
51
|
+
#=== 各セルに ID (整数値)を割付ける
|
|
52
|
+
def set_cell_id_and_domain
|
|
53
|
+
# celltype の各セルに ID を割付ける
|
|
54
|
+
@celltype_list.each {|t|
|
|
55
|
+
t.set_cell_id_and_domain
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# サブネームスペースの各セルに ID を割付ける
|
|
59
|
+
@namespace_list.each {|n|
|
|
60
|
+
n.set_cell_id_and_domain
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def optimize
|
|
65
|
+
# celltype の最適化
|
|
66
|
+
@celltype_list.each {|t|
|
|
67
|
+
t.optimize
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# サブネームスペースの最適化
|
|
71
|
+
@namespace_list.each {|n|
|
|
72
|
+
n.optimize
|
|
73
|
+
}
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def reset_optimize
|
|
77
|
+
# celltype の最適化
|
|
78
|
+
@celltype_list.each {|t|
|
|
79
|
+
t.reset_optimize
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# サブネームスペースの最適化
|
|
83
|
+
@namespace_list.each {|n|
|
|
84
|
+
n.reset_optimize
|
|
85
|
+
}
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
class Celltype
|
|
90
|
+
ID_BASE = 1 # reset_optimize でリセットする
|
|
91
|
+
@@ID_BASE = ID_BASE
|
|
92
|
+
|
|
93
|
+
def set_cell_id_and_domain
|
|
94
|
+
set_cell_id
|
|
95
|
+
set_domain
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#=== 各セルに ID (整数値)を割付ける
|
|
99
|
+
def set_cell_id
|
|
100
|
+
if $verbose
|
|
101
|
+
print("=== id for the cells of celltype #{get_namespace_path} ===\n")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if $unique_id
|
|
105
|
+
@id_base = @@ID_BASE # id をシステム全体で連番にする
|
|
106
|
+
else
|
|
107
|
+
@id_base = 1 # base を常に 1 から始める
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
id_specified_cells = []
|
|
111
|
+
no_id_specified_cells = []
|
|
112
|
+
|
|
113
|
+
# プロトタイプを除いた数を求める
|
|
114
|
+
@cell_list.each{|c|
|
|
115
|
+
if c.is_generate?
|
|
116
|
+
# c.set_id( @id_base + @n_cell_gen )
|
|
117
|
+
id = c.get_specified_id
|
|
118
|
+
if id
|
|
119
|
+
id_specified_cells << c
|
|
120
|
+
else
|
|
121
|
+
no_id_specified_cells << c
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# p "#{c.get_name} #{@id_base+@n_cell_gen}"
|
|
125
|
+
@@ID_BASE += 1
|
|
126
|
+
@n_cell_gen += 1
|
|
127
|
+
end
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@ordered_cell_list = [] # id = 1 が添数 0 に格納される
|
|
131
|
+
# ID 指定されているセルに id 番号を与える
|
|
132
|
+
id_specified_cells.each{|c|
|
|
133
|
+
id = c.get_specified_id
|
|
134
|
+
if id > 0
|
|
135
|
+
if id >= @n_cell_gen
|
|
136
|
+
cdl_error("S3001 $1: id too large $2 (max=$3)", c.get_name, id, @n_cell_gen)
|
|
137
|
+
next
|
|
138
|
+
end
|
|
139
|
+
else
|
|
140
|
+
if - id >= @n_cell_gen
|
|
141
|
+
cdl_error("S3002 $1: id too large $2 (max=$3)", c.get_name, id, @n_cell_gen)
|
|
142
|
+
next
|
|
143
|
+
end
|
|
144
|
+
id = @n_cell_gen + id + 1
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
if @ordered_cell_list[id - 1]
|
|
148
|
+
cdl_error("S3003 $1: id number '$2' conflict with $3", c.get_name, id, @ordered_cell_list[id - 1].get_name)
|
|
149
|
+
end
|
|
150
|
+
@ordered_cell_list[id - 1] = c
|
|
151
|
+
# 通し番号とする場合のため @id_base を加える
|
|
152
|
+
c.set_id(@id_base - 1 + id)
|
|
153
|
+
if $verbose
|
|
154
|
+
print("#{c.get_name}: id=#{c.get_id} specified id=#{c.get_specified_id}\n")
|
|
155
|
+
end
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# ID 指定されていないセルに id 番号を与える
|
|
159
|
+
i = 0
|
|
160
|
+
no_id_specified_cells.each{|c|
|
|
161
|
+
while !@ordered_cell_list[i].nil?
|
|
162
|
+
i += 1
|
|
163
|
+
end
|
|
164
|
+
@ordered_cell_list[i] = c
|
|
165
|
+
c.set_id(@id_base + i)
|
|
166
|
+
if $verbose
|
|
167
|
+
print("#{c.get_name}: id=#{c.get_id}\n")
|
|
168
|
+
end
|
|
169
|
+
}
|
|
170
|
+
if @n_cell_gen > 0 && i >= @n_cell_gen
|
|
171
|
+
raise "id over id=#{i} N=#{@n_cell_gen}"
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def set_domain
|
|
176
|
+
domain_cells = {}
|
|
177
|
+
@cell_list.each{|c|
|
|
178
|
+
if c.is_generate?
|
|
179
|
+
dr = c.get_region.get_domain_root
|
|
180
|
+
if dr.get_domain_type
|
|
181
|
+
dn = dr.get_domain_type.get_name
|
|
182
|
+
else
|
|
183
|
+
dn = nil
|
|
184
|
+
end
|
|
185
|
+
if @domain_roots[dn]
|
|
186
|
+
@domain_roots[dn] << dr
|
|
187
|
+
else
|
|
188
|
+
@domain_roots[dn] = [dr]
|
|
189
|
+
end
|
|
190
|
+
if domain_cells[dr]
|
|
191
|
+
domain_cells[dr] << c
|
|
192
|
+
else
|
|
193
|
+
domain_cells[dr] = [c]
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
@domain_roots.each{|dn, drs|
|
|
199
|
+
drs.uniq!
|
|
200
|
+
if $verbose && dn
|
|
201
|
+
print "[domain] celltype=#{@name} domainType=#{dn} domainRootRegions={"
|
|
202
|
+
delim = ""
|
|
203
|
+
drs.each{|r|
|
|
204
|
+
print delim, r.get_name
|
|
205
|
+
delim = ", "
|
|
206
|
+
}
|
|
207
|
+
print "}\n"
|
|
208
|
+
drs.each{|r|
|
|
209
|
+
print "[domain] celltype=#{@name} domainRootRegion=#{r.get_name} domainType=#{dn} domainKind=#{r.get_domain_root.get_domain_type.get_kind} domainCells={"
|
|
210
|
+
delim = ""
|
|
211
|
+
domain_cells[r].each{|c|
|
|
212
|
+
print delim, c.get_name
|
|
213
|
+
delim = ", "
|
|
214
|
+
}
|
|
215
|
+
print "}\n"
|
|
216
|
+
}
|
|
217
|
+
end
|
|
218
|
+
}
|
|
219
|
+
if @domain_roots.length > 1
|
|
220
|
+
p @domain_roots
|
|
221
|
+
raise "ambigous DomainType"
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
@domain_roots.each{|dn, regions|
|
|
225
|
+
# domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
|
|
226
|
+
if regions.length > 1
|
|
227
|
+
cdl_info("I9999 celltype '$1' has cells in multi-domain.\n", @name)
|
|
228
|
+
if @idx_is_id == false
|
|
229
|
+
cdl_info("I9999 celltype '$1' forcely set idx_is_id\n", @name)
|
|
230
|
+
end
|
|
231
|
+
@idx_is_id_act = true
|
|
232
|
+
end
|
|
233
|
+
}
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def optimize
|
|
237
|
+
# port の参照するセルタイプの数、セルの数を求める
|
|
238
|
+
if $verbose
|
|
239
|
+
print "=== optimizing celltype #{get_namespace_path} ===\n"
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
optimize_call
|
|
243
|
+
if $unopt_entry == false
|
|
244
|
+
optimize_entry
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
#=== Celltype#呼び口最適化
|
|
249
|
+
def optimize_call
|
|
250
|
+
@port.each{|port|
|
|
251
|
+
next if port.get_port_type != :CALL
|
|
252
|
+
if port.is_omit?
|
|
253
|
+
# 呼び口最適化実施
|
|
254
|
+
@b_cp_optimized = true
|
|
255
|
+
@n_call_port_omitted_in_CB += 1 # CB で省略する呼び口
|
|
256
|
+
port.set_skelton_useless # スケルトン関数不要最適化
|
|
257
|
+
port.set_VMT_useless # VMT 不要最適化 (直接受け口関数を呼出す)
|
|
258
|
+
if $verbose
|
|
259
|
+
print "optimized by omit: port: #{port.get_name} : o\n"
|
|
260
|
+
end
|
|
261
|
+
next
|
|
262
|
+
elsif port.is_dynamic?
|
|
263
|
+
if $verbose
|
|
264
|
+
print "unoptimized by dynamic: port: #{port.get_name}\n"
|
|
265
|
+
end
|
|
266
|
+
next
|
|
267
|
+
elsif port.is_ref_desc?
|
|
268
|
+
if $verbose
|
|
269
|
+
print "unoptimized by ref_desc: port: #{port.get_name}\n"
|
|
270
|
+
end
|
|
271
|
+
next
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
if $verbose
|
|
275
|
+
print "optimizing port : #{port.get_name}\n"
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
port_cells = [] # 呼び先セル
|
|
279
|
+
port_ports = [] # 呼び先のポート
|
|
280
|
+
|
|
281
|
+
# セルの参照するセルを集める(ポートも一緒に集める)
|
|
282
|
+
@cell_list.each{|cell|
|
|
283
|
+
|
|
284
|
+
if !cell.is_generate?
|
|
285
|
+
next
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
jl = cell.get_join_list
|
|
289
|
+
j = jl.get_item(port.get_name)
|
|
290
|
+
|
|
291
|
+
if j
|
|
292
|
+
if j.get_array_member2
|
|
293
|
+
# 呼び口配列の場合、全部の結合先を集める
|
|
294
|
+
j.get_array_member2.each {|j2|
|
|
295
|
+
if j2
|
|
296
|
+
port_cells << j2.get_rhs_cell
|
|
297
|
+
port_ports << j2.get_rhs_port # 右辺のポート
|
|
298
|
+
else
|
|
299
|
+
# optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
|
|
300
|
+
port_cells << nil
|
|
301
|
+
port_ports << nil
|
|
302
|
+
end
|
|
303
|
+
}
|
|
304
|
+
else
|
|
305
|
+
# 全ての結合先を集める
|
|
306
|
+
port_cells << j.get_rhs_cell
|
|
307
|
+
port_ports << j.get_rhs_port # 右辺のポート
|
|
308
|
+
end
|
|
309
|
+
else
|
|
310
|
+
# optional で初期化されていない(nil を要素に加えておく)
|
|
311
|
+
port_cells << nil
|
|
312
|
+
port_ports << nil # 右辺のポート
|
|
313
|
+
end
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
# 重複要素を取り除く
|
|
317
|
+
port_cells.uniq!
|
|
318
|
+
port_ports.uniq!
|
|
319
|
+
|
|
320
|
+
# 呼び口の呼び先が一つのポートだけか?
|
|
321
|
+
if port_ports.length == 1
|
|
322
|
+
|
|
323
|
+
# 呼び口配列が可変長の場合、最適化しない
|
|
324
|
+
# mikan 呼び口配列要素数マクロ不具合暫定対策
|
|
325
|
+
# より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#)
|
|
326
|
+
# さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
|
|
327
|
+
next if port.get_array_size == "[]"
|
|
328
|
+
|
|
329
|
+
# 呼び口最適化実施
|
|
330
|
+
@b_cp_optimized = true
|
|
331
|
+
|
|
332
|
+
# 呼び先が一つのセルだけか?
|
|
333
|
+
if port_cells.length == 1
|
|
334
|
+
|
|
335
|
+
# 呼び口は optional で初期化されていない、または受け口は配列ではないか?
|
|
336
|
+
if port_ports[0].nil? || port_ports[0].get_array_size.nil?
|
|
337
|
+
|
|
338
|
+
@n_call_port_omitted_in_CB += 1 # CB で省略する呼び口
|
|
339
|
+
port.set_cell_unique # セル一つだけ最適化
|
|
340
|
+
port.set_skelton_useless # スケルトン関数不要最適化
|
|
341
|
+
port.set_VMT_useless # VMT 不要最適化 (直接受け口関数を呼出す)
|
|
342
|
+
|
|
343
|
+
if $verbose
|
|
344
|
+
print "cell_unique, VMT_useless & skelton_useless optimize\n"
|
|
345
|
+
end
|
|
346
|
+
else
|
|
347
|
+
port.set_VMT_useless # VMT 不要最適化 (スケルトン関数を呼出す)
|
|
348
|
+
|
|
349
|
+
if $verbose
|
|
350
|
+
print "VMT_useless optimize\n"
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
else # 呼び先が複数のセル(単一のポート)
|
|
355
|
+
|
|
356
|
+
# 呼び口は optional で初期化されていない、または受け口は配列ではないか?
|
|
357
|
+
if port_ports[0].nil? || port_ports[0].get_array_size.nil?
|
|
358
|
+
if !@singleton
|
|
359
|
+
port.set_skelton_useless # スケルトン関数不要最適化
|
|
360
|
+
port.set_VMT_useless # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
|
|
361
|
+
|
|
362
|
+
if $verbose
|
|
363
|
+
print "VMT_useless & skelton useless optimize\n"
|
|
364
|
+
end
|
|
365
|
+
else
|
|
366
|
+
port.set_VMT_useless # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
|
|
367
|
+
|
|
368
|
+
if $verbose
|
|
369
|
+
print "VMT_useless optimize\n"
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
port.set_only_callee(port_ports[0], port_cells[0])
|
|
376
|
+
# set_cell_unique でない場合 cell は意味がない
|
|
377
|
+
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
# debug
|
|
381
|
+
dbgPrint "#{port.get_name} : # of cells : #{port_cells.length} # of ports : #{port_ports.length}\n"
|
|
382
|
+
}
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
#=== Celltype#受け口最適化
|
|
386
|
+
# optimize_entry は、呼び口最適化の結果を使用している
|
|
387
|
+
def optimize_entry
|
|
388
|
+
# 受け口最適化の設定
|
|
389
|
+
@port.each{|port|
|
|
390
|
+
next if port.get_port_type != :CALL
|
|
391
|
+
|
|
392
|
+
# 呼び口側の最適化状態
|
|
393
|
+
b_VMT_useless = port.is_VMT_useless?
|
|
394
|
+
b_skelton_useless = port.is_skelton_useless?
|
|
395
|
+
|
|
396
|
+
# セルの参照するセルを集める(ポートも一緒に集める)
|
|
397
|
+
@cell_list.each{|cell|
|
|
398
|
+
|
|
399
|
+
if !cell.is_generate?
|
|
400
|
+
next
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
jl = cell.get_join_list
|
|
404
|
+
j = jl.get_item(port.get_name)
|
|
405
|
+
|
|
406
|
+
if j # optional で結合されていない場合 nil
|
|
407
|
+
if j.get_array_member2
|
|
408
|
+
# 呼び口配列
|
|
409
|
+
j.get_array_member2.each {|j2|
|
|
410
|
+
if j2
|
|
411
|
+
port2 = j2.get_rhs_port # 右辺のポート
|
|
412
|
+
# 受け口側の最適化可能性を設定
|
|
413
|
+
port2.set_entry_VMT_skelton_useless(b_VMT_useless, b_skelton_useless)
|
|
414
|
+
# else
|
|
415
|
+
# optional で呼び口配列要素が初期化されていない
|
|
416
|
+
end
|
|
417
|
+
}
|
|
418
|
+
else
|
|
419
|
+
port2 = j.get_rhs_port # 右辺のポート
|
|
420
|
+
# 受け口側の最適化可能性を設定
|
|
421
|
+
port2.set_entry_VMT_skelton_useless(b_VMT_useless, b_skelton_useless)
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# Celltype# リセットする
|
|
429
|
+
def reset_optimize
|
|
430
|
+
@@ID_BASE = ID_BASE # 本当は一回だけでよい
|
|
431
|
+
@id_base = 1 # set_cell_id でリセットされるので不要
|
|
432
|
+
|
|
433
|
+
@b_cp_optimized = false # 呼び口最適化
|
|
434
|
+
@n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
|
|
435
|
+
@n_cell_gen = 0 # 生成セル個数
|
|
436
|
+
@port.each{|p|
|
|
437
|
+
p.reset_optimize
|
|
438
|
+
}
|
|
439
|
+
@included_header = {}
|
|
440
|
+
@domain_roots = {}
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# Celltype# ヘッダは include されているか
|
|
444
|
+
# hname::Symbol : ヘッダ名
|
|
445
|
+
# RETURN:: bool_t: false インクルードされていない、true インクルードされている
|
|
446
|
+
# #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
|
|
447
|
+
# false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
|
|
448
|
+
def header_included?(hname)
|
|
449
|
+
if @included_header[hname].nil?
|
|
450
|
+
@included_header[hname] = true
|
|
451
|
+
return false
|
|
452
|
+
else
|
|
453
|
+
return true
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
end
|