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,218 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# TECS Generator
|
|
4
|
+
# Generator for TOPPERS Embedded Component System
|
|
5
|
+
#
|
|
6
|
+
# Copyright (C) 2008-2019 by TOPPERS Project
|
|
7
|
+
#--
|
|
8
|
+
# 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
|
|
9
|
+
# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
|
10
|
+
# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
|
11
|
+
# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
|
12
|
+
# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
|
13
|
+
# スコード中に含まれていること.
|
|
14
|
+
# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
|
15
|
+
# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
|
16
|
+
# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
|
17
|
+
# の無保証規定を掲載すること.
|
|
18
|
+
# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
|
19
|
+
# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
|
20
|
+
# と.
|
|
21
|
+
# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
|
22
|
+
# 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
|
23
|
+
# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
|
24
|
+
# 報告すること.
|
|
25
|
+
# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
|
26
|
+
# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
|
27
|
+
# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
|
28
|
+
# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
|
29
|
+
# 免責すること.
|
|
30
|
+
#
|
|
31
|
+
# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
|
32
|
+
# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
|
33
|
+
# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
|
34
|
+
# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
|
35
|
+
# の責任を負わない.
|
|
36
|
+
#
|
|
37
|
+
# $Id: bnf.y.rb 2850 2018-04-01 12:38:45Z okuma-top $
|
|
38
|
+
#++
|
|
39
|
+
|
|
40
|
+
# Marshal.dump で不都合な事項への対策
|
|
41
|
+
# Proc は _dump_data が定義されていないため、定義する.
|
|
42
|
+
# plugin 関係は、tecsflow に Plugin クラスが存在しないため、消しておく.
|
|
43
|
+
|
|
44
|
+
# Proc は、Marshal.dump することができないため _dump_data を定義
|
|
45
|
+
class Proc
|
|
46
|
+
def _dump_data
|
|
47
|
+
nil
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class Object
|
|
52
|
+
@@visited = {}
|
|
53
|
+
@@n_visited = 0
|
|
54
|
+
@@n_found = 0
|
|
55
|
+
@@n_plugin_proxy = 0
|
|
56
|
+
|
|
57
|
+
# do nothing now. this function is used to find remained Proxy object.
|
|
58
|
+
def find_plugin level, object_list
|
|
59
|
+
|
|
60
|
+
# find_plugin_1 level, object_list
|
|
61
|
+
# print "find_plugin: n_visted=", @@n_visited, " (len=", @@visited.length, ") found=", @@n_found, " proxy=", @@n_plugin_proxy, "\n"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def find_plugin_1 level, object_list
|
|
65
|
+
if @@visited[ self ] then
|
|
66
|
+
return
|
|
67
|
+
end
|
|
68
|
+
@@visited[ self ] = true
|
|
69
|
+
@@n_visited += 1
|
|
70
|
+
|
|
71
|
+
if kind_of? Expression then
|
|
72
|
+
# print # Expression では print が別に定義されている
|
|
73
|
+
get_elements.each{|ele|
|
|
74
|
+
ele.find_plugin_1 level+1, object_list
|
|
75
|
+
}
|
|
76
|
+
return
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if level > 100 then # 100 is enough now, 50 is too small
|
|
80
|
+
print "reached max level: "
|
|
81
|
+
if respond_to? :get_name then
|
|
82
|
+
print "#{get_name}(#{self.class.name})\n"
|
|
83
|
+
else
|
|
84
|
+
print "(#{self.class.name})\n"
|
|
85
|
+
end
|
|
86
|
+
return
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
object_list.push self ##### ここから return 不可
|
|
90
|
+
|
|
91
|
+
if (kind_of? Plugin) || (kind_of? HRPSVCPlugin) then
|
|
92
|
+
@@n_found += 1
|
|
93
|
+
print "Plugin found: #{self.class.name}\n"
|
|
94
|
+
object_list.each{ |obj|
|
|
95
|
+
if obj.respond_to? :get_name then
|
|
96
|
+
print "#{obj.get_name}(#{obj.class.name}), "
|
|
97
|
+
else
|
|
98
|
+
print "(#{obj.class.name}), "
|
|
99
|
+
end
|
|
100
|
+
}
|
|
101
|
+
print "\n"
|
|
102
|
+
elsif kind_of? Join::ThroughPluginProxy then
|
|
103
|
+
@@n_plugin_proxy += 1
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
level += 1
|
|
107
|
+
if kind_of? Array then
|
|
108
|
+
each{ |val|
|
|
109
|
+
val.find_plugin_1 level, object_list
|
|
110
|
+
}
|
|
111
|
+
elsif kind_of? Hash then
|
|
112
|
+
each{ |key, val|
|
|
113
|
+
key.find_plugin_1 level, object_list
|
|
114
|
+
val.find_plugin_1 level, object_list
|
|
115
|
+
}
|
|
116
|
+
else
|
|
117
|
+
instance_variables.each{|iv|
|
|
118
|
+
iv_val = instance_variable_get iv
|
|
119
|
+
iv_val.find_plugin_1 level, object_list
|
|
120
|
+
}
|
|
121
|
+
end
|
|
122
|
+
object_list.pop ##### ここまで return 不可
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
class Namespace
|
|
127
|
+
def unjoin_plugin
|
|
128
|
+
@signature_list.each{ |sig| sig.unjoin_plugin }
|
|
129
|
+
@celltype_list.each{ |ct| ct.unjoin_plugin }
|
|
130
|
+
@cell_list.each{ |cell| cell.unjoin_plugin }
|
|
131
|
+
@namespace_list.each{ |ns| ns.unjoin_plugin}
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
class Region < Namespace
|
|
136
|
+
def unjoin_plugin
|
|
137
|
+
if @domain_type then
|
|
138
|
+
@domain_type.unjoin_plugin
|
|
139
|
+
end
|
|
140
|
+
@cell_port_throug_plugin_list.each{ |key, po|
|
|
141
|
+
proxy = Join::ThroughPluginProxy.new po.get_cell_namespace_path, po.get_through_entry_port_name, po.get_through_entry_port_subscript
|
|
142
|
+
@cell_port_throug_plugin_list[ key ] = proxy
|
|
143
|
+
}
|
|
144
|
+
super
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
class DomainType < Node
|
|
149
|
+
def unjoin_plugin
|
|
150
|
+
@plugin = nil
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class Signature < NSBDNode
|
|
155
|
+
def unjoin_plugin
|
|
156
|
+
@generate = nil
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class Celltype < NSBDNode
|
|
161
|
+
def unjoin_plugin
|
|
162
|
+
@generate = nil
|
|
163
|
+
@generate_list = []
|
|
164
|
+
@plugin = nil
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
class Cell < NSBDNode
|
|
169
|
+
def unjoin_plugin
|
|
170
|
+
@generate = nil
|
|
171
|
+
@plugin = nil
|
|
172
|
+
@join_list.get_items.each{ |j| j.unjoin_plugin }
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
class Join < BDNode
|
|
177
|
+
class ThroughPluginProxy
|
|
178
|
+
def initialize namespace_path, entry_port_name, entry_port_subscript
|
|
179
|
+
@namespace_path = namespace_path
|
|
180
|
+
@entry_port_name = entry_port_name
|
|
181
|
+
@entry_port_subscript = entry_port_subscript
|
|
182
|
+
end
|
|
183
|
+
def get_cell_namespace_path
|
|
184
|
+
@namespace_path
|
|
185
|
+
end
|
|
186
|
+
def get_through_entry_port_name
|
|
187
|
+
@entry_port_name
|
|
188
|
+
end
|
|
189
|
+
def get_through_entry_port_subscript
|
|
190
|
+
@entry_port_subscript
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def unjoin_plugin
|
|
195
|
+
# @thourhg_generated_list is refered in get_rhs_cell, get_rhs_port
|
|
196
|
+
@through_generated_list.map!{|po| # po: plugin object
|
|
197
|
+
ThroughPluginProxy.new po.get_cell_namespace_path, po.get_through_entry_port_name, po.get_through_entry_port_subscript
|
|
198
|
+
}
|
|
199
|
+
@region_through_generated_list.map!{|po| # po: plugin object
|
|
200
|
+
ThroughPluginProxy.new po.get_cell_namespace_path, po.get_through_entry_port_name, po.get_through_entry_port_subscript
|
|
201
|
+
}
|
|
202
|
+
if @array_member2 then
|
|
203
|
+
@array_member2.each{ |j|
|
|
204
|
+
if j then
|
|
205
|
+
j.unjoin_plugin2
|
|
206
|
+
end
|
|
207
|
+
}
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
def unjoin_plugin2
|
|
211
|
+
@through_generated_list.map!{|po| # po: plugin object
|
|
212
|
+
ThroughPluginProxy.new po.get_cell_namespace_path, po.get_through_entry_port_name, po.get_through_entry_port_subscript
|
|
213
|
+
}
|
|
214
|
+
@region_through_generated_list.map!{|po| # po: plugin object
|
|
215
|
+
ThroughPluginProxy.new po.get_cell_namespace_path, po.get_through_entry_port_name, po.get_through_entry_port_subscript
|
|
216
|
+
}
|
|
217
|
+
end
|
|
218
|
+
end
|
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
#
|
|
2
|
+
# TECS Generator
|
|
3
|
+
# Generator for TOPPERS Embedded Component System
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2008-2014 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: value.rb 2061 2014-05-31 22:15:33Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
#= BaseVal 整数、浮動小数などの値を扱うクラスの基底クラス
|
|
40
|
+
#
|
|
41
|
+
# TECS の CDL で扱う値は、以下に分類される
|
|
42
|
+
# ・整数
|
|
43
|
+
# ・浮動小数
|
|
44
|
+
# ・文字列
|
|
45
|
+
# ・ブール値
|
|
46
|
+
# 集成型(構造体、配列)と C_EXP はここでは扱わない
|
|
47
|
+
#
|
|
48
|
+
# このクラスで定義済みの演算子は、エラーとなる
|
|
49
|
+
# 型により演算可能な場合、演算子をオーバーライドする
|
|
50
|
+
#
|
|
51
|
+
class BaseVal < Node
|
|
52
|
+
def ~@
|
|
53
|
+
unsupport "~"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def -@
|
|
57
|
+
unsupport "unary -"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def +@
|
|
61
|
+
unsupport "unary +"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def not # ! val
|
|
65
|
+
unsupport "!"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def *(val)
|
|
69
|
+
unsupport "*"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def /(val)
|
|
73
|
+
unsupport "/"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def %(val)
|
|
77
|
+
unsupport "%"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def +(val)
|
|
81
|
+
unsupport "+"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def -(val)
|
|
85
|
+
unsupport "-"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def <<(val)
|
|
89
|
+
unsupport "<<"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def >>(val)
|
|
93
|
+
unsupport ">>"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def >(val)
|
|
97
|
+
unsupport ">"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def <(val)
|
|
101
|
+
unsupport "<"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def >=(val)
|
|
105
|
+
unsupport ">="
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def <=(val)
|
|
109
|
+
unsupport "<="
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def eq(val) # == val
|
|
113
|
+
unsupport "=="
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def neq(val) # != val
|
|
117
|
+
unsupport "!="
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def &(val)
|
|
121
|
+
unsupport "&"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def ^(val)
|
|
125
|
+
unsupport "^"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def |(val)
|
|
129
|
+
unsupport "|"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def lAND(val) # && val
|
|
133
|
+
unsupport "&&"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def lOR(val) # || val
|
|
137
|
+
unsupport "||"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def cast(type)
|
|
141
|
+
unsupport "CAST"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def unsupport(op)
|
|
145
|
+
cdl_error("V1001 $1: unable for $2", op, self.class)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def to_s
|
|
149
|
+
raise "to_s not overridden"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def to_b
|
|
153
|
+
cdl_error("V1002 $1: cannot cast to bool (implicitly)", self.class)
|
|
154
|
+
false
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def to_i
|
|
158
|
+
cdl_error("V1003 $1: cannot cast to integer (implicitly)", self.class)
|
|
159
|
+
1
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def to_f
|
|
163
|
+
cdl_error("V1004 $1: cannot cast to float (implicitly)", self.class)
|
|
164
|
+
1.0
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
#= Pointer 値 (IntegerVal の Pointer 版)
|
|
169
|
+
#
|
|
170
|
+
# ポインタ値は、CDL で直接生成されることはない
|
|
171
|
+
# 整数値のキャスト演算により生成される
|
|
172
|
+
class PointerVal < BaseVal
|
|
173
|
+
# @int_val:: IntegerVal: IntegerVal でなくてはならない
|
|
174
|
+
# @ptr_type:: PtrType: ポインタの指す先の型
|
|
175
|
+
|
|
176
|
+
def initialize(int_val, ptr_type)
|
|
177
|
+
super()
|
|
178
|
+
@int_val = int_val
|
|
179
|
+
@ptr_type = ptr_type
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
#=== ポインタの指す先の型を得る
|
|
183
|
+
# PointerVal 専用のメソッド
|
|
184
|
+
def get_type
|
|
185
|
+
@ptr_type
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def cast(type)
|
|
189
|
+
t = type.get_original_type # typedef の元を得る
|
|
190
|
+
if t.is_a? IntType
|
|
191
|
+
val = t.check_and_clip(@int_val, :IntType)
|
|
192
|
+
return IntegerVal.new(val)
|
|
193
|
+
elsif t.is_a? FloatType
|
|
194
|
+
cdl_error("V1005 Cannot cast pointer to float")
|
|
195
|
+
return FloatVal.new(@int_val)
|
|
196
|
+
elsif t.is_a? PtrType
|
|
197
|
+
return PointerVal.new(@int_val, type)
|
|
198
|
+
else
|
|
199
|
+
cdl_error("V1006 pointer value cannot cast to $1", type.class)
|
|
200
|
+
return nil
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def to_s
|
|
205
|
+
"(#{@ptr_type.get_type_str}#{@ptr_type.get_type_str_post})#{sprintf("0x%X", @int_val)}"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def to_b
|
|
209
|
+
cdl_error("V1007 convert pointer value to bool")
|
|
210
|
+
false
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def to_i
|
|
214
|
+
cdl_error("V1008 convert pointer value to integer without cast")
|
|
215
|
+
@val.to_i
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
#= IntegerVal: 整数値を扱うクラス
|
|
220
|
+
class IntegerVal < BaseVal
|
|
221
|
+
# @val:: Integer: value
|
|
222
|
+
# @str:: string: literal
|
|
223
|
+
# @sign:: Symbol: :SIGNED | :UNSIGNED
|
|
224
|
+
# @size:: Symbol: :NORMAL | :SHORT | :LONG | :LONGLONG
|
|
225
|
+
|
|
226
|
+
def initialize(val, str = nil, sign = :SIGNED, size = :NORMAL)
|
|
227
|
+
super()
|
|
228
|
+
@val = val.to_i
|
|
229
|
+
@str = str
|
|
230
|
+
@sign = sign
|
|
231
|
+
@size = size
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def ~@
|
|
235
|
+
IntegerVal.new(~ @val)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def -@
|
|
239
|
+
IntegerVal.new(- @val)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def +@
|
|
243
|
+
self
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def not # !
|
|
247
|
+
BoolVal.new(self.to_b)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def *(val)
|
|
251
|
+
if val.is_a? FloatVal
|
|
252
|
+
return FloatVal.new(@val.to_f * val.to_f)
|
|
253
|
+
else
|
|
254
|
+
return IntegerVal.new(@val * val.to_i)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def /(val)
|
|
259
|
+
if val.is_a? FloatVal
|
|
260
|
+
v2 = val.to_f # to_f を2回評価しない
|
|
261
|
+
if v2 == 0.0
|
|
262
|
+
cdl_error("V1009 / : divieded by zero")
|
|
263
|
+
return FloatVal.new(1.0)
|
|
264
|
+
end
|
|
265
|
+
return FloatVal.new(@val.to_f / v2)
|
|
266
|
+
else
|
|
267
|
+
v2 = val.to_i # to_i を2回評価しない
|
|
268
|
+
if v2 == 0
|
|
269
|
+
cdl_error("V1010 / : divieded by zero")
|
|
270
|
+
return IntegerVal.new(1)
|
|
271
|
+
end
|
|
272
|
+
return IntegerVal.new(@val / v2)
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def %(val)
|
|
277
|
+
if val.is_a? FloatVal
|
|
278
|
+
v2 = val.to_f # to_f を2回評価しない
|
|
279
|
+
if v2 == 0.0
|
|
280
|
+
cdl_error("V1011 % : divieded by zero")
|
|
281
|
+
return FloatVal.new(1.0)
|
|
282
|
+
end
|
|
283
|
+
return FloatVal.new(@val.to_f % v2)
|
|
284
|
+
else
|
|
285
|
+
v2 = val.to_i # to_i を2回評価しない
|
|
286
|
+
if v2 == 0
|
|
287
|
+
cdl_error("V1012 % : divieded by zero")
|
|
288
|
+
return IntegerVal.new(1)
|
|
289
|
+
end
|
|
290
|
+
return IntegerVal.new(@val % v2)
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def +(val)
|
|
295
|
+
if val.is_a? FloatVal
|
|
296
|
+
return FloatVal.new(@val.to_f + val.to_f)
|
|
297
|
+
else
|
|
298
|
+
return IntegerVal.new(@val + val.to_i)
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def -(val)
|
|
303
|
+
if val.is_a? FloatVal
|
|
304
|
+
return FloatVal.new(@val.to_f - val.to_f)
|
|
305
|
+
else
|
|
306
|
+
return IntegerVal.new(@val - val.to_i)
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def <<(val)
|
|
311
|
+
return IntegerVal.new(@val << val.to_i)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def >>(val)
|
|
315
|
+
return IntegerVal.new(@val >> val.to_i)
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def >(val)
|
|
319
|
+
if val.is_a? FloatVal
|
|
320
|
+
return BoolVal.new(@val.to_f > val.to_f)
|
|
321
|
+
else
|
|
322
|
+
return BoolVal.new(@val > val.to_i)
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def <(val)
|
|
327
|
+
if val.is_a? FloatVal
|
|
328
|
+
return BoolVal.new(@val.to_f < val.to_f)
|
|
329
|
+
else
|
|
330
|
+
return BoolVal.new(@val < val.to_i)
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def >=(val)
|
|
335
|
+
if val.is_a? FloatVal
|
|
336
|
+
return BoolVal.new(@val.to_f >= val.to_f)
|
|
337
|
+
else
|
|
338
|
+
return BoolVal.new(@val >= val.to_i)
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def <=(val)
|
|
343
|
+
if val.is_a? FloatVal
|
|
344
|
+
return BoolVal.new(@val.to_f <= val.to_f)
|
|
345
|
+
else
|
|
346
|
+
return BoolVal.new(@val <= val.to_i)
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def eq(val) # == val
|
|
351
|
+
if val.is_a? FloatVal
|
|
352
|
+
return BoolVal.new(@val.to_f == val.to_f)
|
|
353
|
+
else
|
|
354
|
+
return BoolVal.new(@val == val.to_i)
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def neq(val) # != val
|
|
359
|
+
if val.is_a? FloatVal
|
|
360
|
+
return BoolVal.new(@val.to_f != val.to_f)
|
|
361
|
+
else
|
|
362
|
+
return BoolVal.new(@val != val.to_i)
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def &(val)
|
|
367
|
+
IntegerVal.new(@val & val.to_i)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
def ^(val)
|
|
371
|
+
IntegerVal.new(@val ^ val.to_i)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def |(val)
|
|
375
|
+
IntegerVal.new(@val | val.to_i)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
def lAND(val) # && val
|
|
379
|
+
BoolVal.new(self.to_b && val.to_b)
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def lOR(val) # || val
|
|
383
|
+
BoolVal.new(self.to_b || val.to_b)
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def cast(type)
|
|
387
|
+
t = type.get_original_type # typedef の元を得る
|
|
388
|
+
if t.is_a? IntType
|
|
389
|
+
val = t.check_and_clip(@val, :IntType)
|
|
390
|
+
return IntegerVal.new(val)
|
|
391
|
+
elsif t.is_a? FloatType
|
|
392
|
+
return FloatVal.new(@val)
|
|
393
|
+
elsif t.is_a? PtrType
|
|
394
|
+
return PointerVal.new(@val, type)
|
|
395
|
+
elsif t.is_a? BoolType
|
|
396
|
+
return BoolVal.new(@val.to_b)
|
|
397
|
+
else
|
|
398
|
+
cdl_error("V1013 integer value cannot cast to $1", type.class)
|
|
399
|
+
return nil
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def to_s
|
|
404
|
+
if @str
|
|
405
|
+
@str
|
|
406
|
+
else
|
|
407
|
+
@val.to_s
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
def to_b
|
|
412
|
+
@val != 0
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
def to_i
|
|
416
|
+
@val
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def to_f
|
|
420
|
+
@val.to_f
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
#= BoolVal: bool 値を扱うクラス
|
|
425
|
+
class BoolVal < BaseVal
|
|
426
|
+
# @val:: bool: true, false
|
|
427
|
+
|
|
428
|
+
def initialize(val)
|
|
429
|
+
super()
|
|
430
|
+
if val == true || val == false
|
|
431
|
+
@val = val
|
|
432
|
+
elsif val.to_i != 0
|
|
433
|
+
@val = true
|
|
434
|
+
else
|
|
435
|
+
@val = false
|
|
436
|
+
end
|
|
437
|
+
# raise "No boolean val" if val != true && val != false
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
def not # ! val
|
|
441
|
+
BoolVal.new(!@val)
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
def eq(val) # == val
|
|
445
|
+
if val.is_a? BoolVal
|
|
446
|
+
return BoolVal.new(self.to_i == val.to_i)
|
|
447
|
+
else
|
|
448
|
+
cdl_error("V1014 comparing bool value with \'$1\'", val.class)
|
|
449
|
+
return BoolVal.new(false)
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def neq(val) # != val
|
|
454
|
+
if val.is_a? BoolVal
|
|
455
|
+
return BoolVal.new(self.to_i != val.to_i)
|
|
456
|
+
else
|
|
457
|
+
cdl_error("V1015 comparing bool value with \'$1\'", val.class)
|
|
458
|
+
return BoolVal.new(false)
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def lAND(val) # && val
|
|
463
|
+
BoolVal.new(self.to_b && val.to_b)
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
def lOR(val) # || val
|
|
467
|
+
BoolVal.new(self.to_b || val.to_b)
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
def cast(type)
|
|
471
|
+
t = type.get_original_type # typedef の元を得る
|
|
472
|
+
if @val
|
|
473
|
+
val = 1
|
|
474
|
+
else
|
|
475
|
+
val = 0
|
|
476
|
+
end
|
|
477
|
+
if t.is_a? IntType
|
|
478
|
+
return IntegerVal.new(val)
|
|
479
|
+
elsif t.is_a? FloatType
|
|
480
|
+
return FloatVal.new(val)
|
|
481
|
+
elsif t.is_a? BoolType
|
|
482
|
+
return self
|
|
483
|
+
else
|
|
484
|
+
cdl_error("V1016 bool value cannot cast to $1", type.class)
|
|
485
|
+
return nil
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
def to_s
|
|
490
|
+
if @val
|
|
491
|
+
return "true"
|
|
492
|
+
else
|
|
493
|
+
return "false"
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
def to_b
|
|
498
|
+
@val
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
def to_i
|
|
502
|
+
return 0 if @val == false
|
|
503
|
+
return 1
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
def to_f
|
|
507
|
+
return 0.0 if @val == false
|
|
508
|
+
return 1.0
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
attr_reader :val
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
#= FloatVal: 実数値を扱うクラス
|
|
515
|
+
class FloatVal < BaseVal
|
|
516
|
+
# @val:: Float
|
|
517
|
+
def initialize(val)
|
|
518
|
+
super()
|
|
519
|
+
@val = val.to_f
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
def -@
|
|
523
|
+
FloatVal.new(- @val)
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def +@
|
|
527
|
+
self
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
def *(val)
|
|
531
|
+
FloatVal.new(@val * val.to_f)
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
def /(val)
|
|
535
|
+
v2 = val.to_f # to_f を2回評価しない
|
|
536
|
+
if v2 == 0.0
|
|
537
|
+
cdl_error("V1017 / : divieded by zero")
|
|
538
|
+
return FloatVal.new(1.0)
|
|
539
|
+
end
|
|
540
|
+
return FloatVal.new(@val.to_f / v2)
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
def %(val)
|
|
544
|
+
v2 = val.to_f # to_f を2回評価しない
|
|
545
|
+
if v2 == 0.0
|
|
546
|
+
cdl_error("V1018 % : divieded by zero")
|
|
547
|
+
return FloatVal.new(1.0)
|
|
548
|
+
end
|
|
549
|
+
return FloatVal.new(@val.to_f % v2)
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
def +(val)
|
|
553
|
+
FloatVal.new(@val + val.to_f)
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
def -(val)
|
|
557
|
+
FloatVal.new(@val - val.to_f)
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
def >(val)
|
|
561
|
+
BoolVal.new(@val > val.to_f)
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
def <(val)
|
|
565
|
+
BoolVal.new(@val < val.to_f)
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
def >=(val)
|
|
569
|
+
BoolVal.new(@val >= val.to_f)
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
def <=(val)
|
|
573
|
+
BoolVal.new(@val <= val.to_f)
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def eq(val) # == val
|
|
577
|
+
BoolVal.new(@val == val.to_f)
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
def neq(val) # != val
|
|
581
|
+
BoolVal.new(@val != val.to_f)
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
def cast(type)
|
|
585
|
+
t = type.get_original_type # typedef の元を得る
|
|
586
|
+
if t.is_a? IntType
|
|
587
|
+
val = t.check_and_clip(@val, :FloatType)
|
|
588
|
+
return IntegerVal.new(val)
|
|
589
|
+
elsif t.is_a? FloatType
|
|
590
|
+
return self
|
|
591
|
+
else
|
|
592
|
+
cdl_error("V1019 floating value cannot cast to $1", type)
|
|
593
|
+
return self
|
|
594
|
+
end
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
def to_b
|
|
598
|
+
cdl_error("V1020 convert floating value to bool without cast")
|
|
599
|
+
@val.to_i
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
def to_i
|
|
603
|
+
cdl_error("V1021 convert floating value to integer without cast")
|
|
604
|
+
@val.to_i
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
def to_s
|
|
608
|
+
@val.to_s
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
def to_f
|
|
612
|
+
@val
|
|
613
|
+
end
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
#= 文字列リテラルを扱うクラス
|
|
617
|
+
class StringVal < BaseVal
|
|
618
|
+
# @str:: Token:
|
|
619
|
+
# @specifier:: Symbol: :WIDE, :NORMAL
|
|
620
|
+
|
|
621
|
+
def initialize(str, spec = :NORMAL)
|
|
622
|
+
super()
|
|
623
|
+
@str = str
|
|
624
|
+
@specifier = spec # mikan L"str" wide 文字列未対応
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
#===
|
|
628
|
+
#
|
|
629
|
+
# string の cast はできない mikan ポインタ型への cast はできるべき
|
|
630
|
+
def cast(type)
|
|
631
|
+
t = type.get_original_type # typedef の元を得る
|
|
632
|
+
if t.is_a? IntType
|
|
633
|
+
cdl_error("V1022 string cannot cast to integer")
|
|
634
|
+
elsif t.is_a? FloatType
|
|
635
|
+
cdl_error("V1023 string cannot cast to float")
|
|
636
|
+
elsif t.is_a? PtrType
|
|
637
|
+
cdl_error("V1024 string cannot cast to pointer")
|
|
638
|
+
else
|
|
639
|
+
cdl_error("V1025 string cannot cast to $1", type)
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
def to_s
|
|
644
|
+
@str.to_s
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
def val
|
|
648
|
+
@str.to_s # Token で扱われていた名残 (val を取り出す)
|
|
649
|
+
end
|
|
650
|
+
end
|