ipxact-ruby 0.13.2 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2010 TIMA Laboratory
1
+ # Copyright (C) 2010, 2011 TIMA Laboratory
2
2
  #
3
3
  # This program is free software: you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -22,8 +22,20 @@ begin
22
22
  gemspec.email = "guillaume.godetbar@gmail.com "
23
23
  gemspec.homepage = "http://tima-sls.imag.fr/www/research/ipxact/"
24
24
  gemspec.authors = ["Guillaume Godet-Bar"]
25
- gemspec.files = FileList["{spec,schemas,autotest}/**/*", "lib/ipxact.rb", "lib/ipxact/*", "lib/ipxact/parser/*", "lib/ipxact/pathfinder/graph_pathfinder.rb", ".autotest", ".gitignore", "Rakefile", "VERSION"]
25
+ gemspec.files = FileList["{schemas,autotest}/**/*", "lib/ipxact.rb", "lib/ipxact/*", "lib/ipxact/parser/*", "lib/ipxact/pathfinder/graph_pathfinder.rb", ".autotest", ".gitignore", "Rakefile", "VERSION"]
26
+ gemspec.test_files = FileList["spec/**/*"]
26
27
  gemspec.add_dependency 'nokogiri'
28
+ gemspec.post_install_message = <<-POST_INSTALL_MESSAGE
29
+
30
+ ("-._UPGRADING_.-")
31
+
32
+ Thank you for installing IP-Xact Ruby - #{File.read("VERSION").strip}.
33
+ Please make sure you have a look at http://tima-sls.imag.fr/www/research/ipxact/upgrading/
34
+ for upgrade info!
35
+
36
+
37
+ POST_INSTALL_MESSAGE
38
+
27
39
  end
28
40
  rescue LoadError
29
41
  puts "Jeweler not available. Install it with: gem install jeweler"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.13.2
1
+ 0.14.0
@@ -191,5 +191,4 @@ require File.join File.dirname(__FILE__), 'ipxact/parser'
191
191
  require File.join File.dirname(__FILE__), 'ipxact/platform'
192
192
  require File.join File.dirname(__FILE__), 'ipxact/register'
193
193
  require File.join File.dirname(__FILE__), 'ipxact/identifier'
194
- require File.join File.dirname(__FILE__), 'ipxact/pathfinder/graph_pathfinder'
195
194
 
@@ -72,93 +72,6 @@ class IPXACT::Component
72
72
  !(self.cpus.nil? || self.cpus.empty?)
73
73
  end
74
74
 
75
- # Calculates an optimal path in the subcomponent graph between
76
- # +subcomponent_start+ and +subcomponent_end+. This computation takes into
77
- # account hierarchical subcomponents, and identifies optimal sub-paths in
78
- # these elements as well, using hierconnections. This method is in fact the
79
- # facade for the {IPXACT::GraphPathFinder} class. It handles the creation of
80
- # the connection Hash, and translates the result in a IPXACT-specific format.
81
- #
82
- # @param [String] subcomponent_start The name of the component instance that
83
- # should be the source of the data path.
84
- # @param [String] subcomponent_end The name of the component instance that
85
- # should be the target of the data path.
86
- #
87
- # @return [Array<Array<Hash>>] an Array of Arrays of Hashes that summarizes
88
- # the component instances and the ports on the data path. Note that this
89
- # data path may be used for calculating the target component's base
90
- # address. The Arrays of Hashes are composed of 2 elements, the first
91
- # element being the source of a connection step and the second element
92
- # being the target of the connection step. Each element is a Hash, built as
93
- # follows:
94
- # +:component_instance+ the String name of the component instance that is
95
- # traversed by the data path;
96
- # +:port_name+ the String name of the port of the component instance that
97
- # is being traversed.
98
- # @raise several exceptions. Please refer to {IPXACT::GraphPathFinder} class
99
- # for more details.
100
- #
101
- def resolve_data_path(subcomponent_start, subcomponent_end)
102
- nodes, connections = rec_prepare_pathfinder_connections([], [])
103
-
104
- pathfinder_connections = connections.collect do |connection|
105
- {
106
- :link => [nodes.index(connection[0][:component_instance]),
107
- nodes.index(connection[1][:component_instance])],
108
- :ports => [connection[0][:port_name], connection[1][:port_name]]
109
- }
110
- end
111
-
112
- pathfinder_interconnect = {:nodes => nodes, :connections => pathfinder_connections}
113
- pathfinder = IPXACT::GraphPathFinder.new(pathfinder_interconnect)
114
- finder_result = pathfinder.resolve(subcomponent_start, subcomponent_end)
115
-
116
- formatted_result = finder_result.collect do |res|
117
- pathfinder_interconnect[:connections][res]
118
- end.collect do |connection|
119
- [
120
- {
121
- :component_instance => pathfinder_interconnect[:nodes][connection[:link][0]],
122
- :port_name => connection[:ports][0]
123
- },
124
- {
125
- :component_instance => pathfinder_interconnect[:nodes][connection[:link][1]],
126
- :port_name => connection[:ports][1]
127
- }
128
- ]
129
- end
130
- end
131
-
132
- # Computes a the base address of the last component instance mentionned in
133
- # the +data_path+. The latter should be calculated using the
134
- # {#resolve_data_path} method. Additionally, this method takes into account
135
- # all subcomponents from the +data_path+, and basically adds up mirrored slave
136
- # ports' remap addresses.
137
- #
138
- # @param [Arrray] data_path the data path from which the base address should be
139
- # calculated. Please refer to the documentation of
140
- # {#resolve_data_path} for more details on the structure of
141
- # this argument.
142
- # @param [Integer] initial_value the value that should be added to the base
143
- # address computed by the method.
144
- #
145
- # Returns the base address of the target component, as an Integer.
146
- #
147
- def resolve_base_address(data_path, initial_value = 0)
148
- base_address = initial_value
149
- data_path.each do |connection|
150
- connection.each do |connection_step|
151
- subcomponent = rec_get_subcomponent(connection_step[:component_instance])
152
- port = subcomponent.ports \
153
- .select{|port| port[:name] == connection_step[:port_name]} \
154
- .first
155
- if port[:type] == :mirrored_slave && !port[:port_data].nil?
156
- base_address += port[:port_data][:remap][:address].to_i(16)
157
- end
158
- end
159
- end
160
- base_address
161
- end
162
75
 
163
76
  # Get the component's register map, if any.
164
77
  #
@@ -227,50 +140,5 @@ class IPXACT::Component
227
140
  current_list
228
141
  end
229
142
 
230
- # Prepares the connection structure for the {IPXACT::GraphPathFinder} class.
231
- # Traverses the hierarchy of subcomponents in order to create a flattened
232
- # representation of the subcomponents graph. In particular, the method
233
- # considers hierconnections, and replaces the wrapper's interface port with
234
- # the subcomponent's port that it is attached to.
235
- #
236
- # @return [Array<Array,Array<Hash>>] an Array of 2 elements, composed of a
237
- # list of nodes and a list of connections. Please refer to the
238
- # {IPXACT::GraphPathFinder#initialize} method for more details on
239
- # the structure of these elements (both Hashes).
240
- #
241
- def rec_prepare_pathfinder_connections(current_nodes, current_interconnections)
242
- if subcomponents.empty?
243
- [current_nodes << self.instance_name, current_interconnections]
244
- else
245
- subcomponents.each do |sub_name, subcomponent|
246
- formatted_interconnections = interconnections.values.collect do |interconnect|
247
- [reformat_connector(interconnect[0]), reformat_connector(interconnect[1])]
248
- end
249
- current_nodes, current_interconnections = \
250
- subcomponent.rec_prepare_pathfinder_connections(current_nodes, current_interconnections + formatted_interconnections)
251
- end
252
- [current_nodes, current_interconnections]
253
- end
254
- end
255
-
256
- # Executes the actual replacement of an hierarchical component's outside port
257
- # with the attached subcomponent port.
258
- #
259
- # @return [Hash] the flattened connector, i.e., a Hash built as follows:
260
- # +:component_instance+ the String name of the component instance that is
261
- # traversed by the data path;
262
- # +:port_name+ the String name of the port of the component
263
- # instance that is being traversed.
264
- #
265
- def reformat_connector(connector)
266
- instance = subcomponents[connector[:component_instance]]
267
- if instance.subcomponents.empty?
268
- new_connector = connector
269
- else
270
- port = connector[:port_name]
271
- new_connector = instance.hierconnections[port]
272
- end
273
- new_connector
274
- end
275
143
 
276
144
  end
@@ -17,60 +17,6 @@
17
17
  require File.join File.dirname(__FILE__), 'general_spec'
18
18
 
19
19
  describe "The data calculation functions of our IPXACT tool" do
20
- it "should be able to find valid data paths when building a driver" do
21
- expected_data_path = [
22
- [
23
- {
24
- :component_instance => 'i_proc',
25
- :port_name => "AHB_Master",
26
- },
27
- {
28
- :component_instance => 'i_ahb',
29
- :port_name => 'AHB_MirroredMaster0'
30
- }
31
- ],
32
- [
33
- {
34
- :component_instance => 'i_ahb',
35
- :port_name => 'AHB_MirroredSlave1'
36
- },
37
- {
38
- :component_instance => 'i_h2p',
39
- :port_name => 'AHB_Slave'
40
- }
41
- ],
42
- [
43
- {
44
- :component_instance => 'i_h2p',
45
- :port_name => 'APB_Master'
46
- },
47
- {
48
- :component_instance => 'i_apb',
49
- :port_name => 'APB_MirroredMaster'
50
- }
51
- ],
52
- [
53
- {
54
- :component_instance => 'i_apb',
55
- :port_name => 'APB_MirroredSlave7'
56
- },
57
- {
58
- :component_instance => 'i_dma',
59
- :port_name => 'APB_Slave'
60
- }
61
- ]
62
- ]
63
-
64
- components = IPXACT::load_components(PLATFORM_PATH)
65
- designs = IPXACT::load_designs(PLATFORM_PATH)
66
- platform = IPXACT::Parser::PlatformData.parse_platform(["Leon2Platform", "1.1"], components, designs)
67
-
68
- data_path = nil
69
- lambda {
70
- data_path = platform.resolve_data_path('i_proc', 'i_dma')
71
- }.should_not raise_exception
72
- data_path.should eql(expected_data_path)
73
- end
74
20
 
75
21
  it "should be able to assign instance variables to mirrored slave addresses and ranges" do
76
22
  expected_values = {
@@ -108,43 +54,4 @@ describe "The data calculation functions of our IPXACT tool" do
108
54
  end
109
55
  end
110
56
 
111
- it "should be able to determine the dma component's base address from the interconnect path" do
112
- # DMA remap address : 0x30000000 + 0x7000 = 0x30007000
113
- components = IPXACT::load_components(PLATFORM_PATH)
114
- designs = IPXACT::load_designs(PLATFORM_PATH)
115
- platform = IPXACT::Parser::PlatformData.parse_platform(["Leon2Platform", "1.1"], components, designs)
116
- data_path = platform.resolve_data_path('i_proc', 'i_dma')
117
-
118
- base_address = platform.resolve_base_address(data_path)
119
- base_address.should == 0x30007000 # AHB remap + APB remap (as defined in the apbSubsystem design file)
120
- end
121
-
122
-
123
- it "should be able to determine the cgu component's base address from the interconnect path" do
124
- components = IPXACT::load_components(PLATFORM_PATH)
125
- designs = IPXACT::load_designs(PLATFORM_PATH)
126
- platform = IPXACT::Parser::PlatformData.parse_platform(["Leon2Platform", "1.2"], components, designs)
127
- data_path = platform.resolve_data_path('i_proc', 'i_cgu')
128
-
129
- base_address = platform.resolve_base_address(data_path)
130
- base_address.should == 0x30004000
131
- end
132
-
133
- it "should be able to take into account the component registers' corresponding address block's base address" do
134
- components = IPXACT::load_components(PLATFORM_PATH)
135
- designs = IPXACT::load_designs(PLATFORM_PATH)
136
- platform = IPXACT::Parser::PlatformData.parse_platform(["Leon2Platform", "1.2"], components, designs)
137
- data_path = platform.resolve_data_path('i_proc', 'i_uart_scml')
138
-
139
- base_address = platform.resolve_base_address(data_path)
140
- port_id = data_path.last[1]
141
- component = platform.rec_get_subcomponent('i_uart_scml')
142
- port = component.port(port_id[:port_name])
143
-
144
- # N.B. There's a remap address error in the "IP-XACT_TLM_Examples_AppNote_V1.5" document that's
145
- # released with the IP-XACT specification: remap address for the i_uart_scml instance does not match
146
- # what is actually in the Leon2Platform file.
147
- (base_address + port[:port_data][:base_address].to_i(16)).should == 0x30000000 + 0x2000 + 0xB0000000
148
- end
149
-
150
57
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 13
8
- - 2
9
- version: 0.13.2
7
+ - 14
8
+ - 0
9
+ version: 0.14.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Guillaume Godet-Bar
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-15 00:00:00 +01:00
17
+ date: 2011-03-14 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -53,7 +53,6 @@ files:
53
53
  - lib/ipxact/parser/component_data_parser.rb
54
54
  - lib/ipxact/parser/identifier_parser.rb
55
55
  - lib/ipxact/parser/platform_data_parser.rb
56
- - lib/ipxact/pathfinder/graph_pathfinder.rb
57
56
  - lib/ipxact/platform.rb
58
57
  - lib/ipxact/register.rb
59
58
  - schemas/abstractionDefinition.xsd
@@ -78,6 +77,8 @@ files:
78
77
  - schemas/signalDrivers.xsd
79
78
  - schemas/simpleTypes.xsd
80
79
  - schemas/subInstances.xsd
80
+ - README.html
81
+ - README.mdown
81
82
  - spec/integration/bus_data_extraction_spec.rb
82
83
  - spec/integration/data_calculation_spec.rb
83
84
  - spec/integration/data_construction_spec.rb
@@ -178,18 +179,18 @@ files:
178
179
  - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/user_specific_Leon2_uart.cc
179
180
  - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/uart_tac.xml
180
181
  - spec/unit/component_spec.rb
181
- - spec/unit/graph_pathfinder_spec.rb
182
182
  - spec/unit/identifier_spec.rb
183
183
  - spec/unit/interconnect_spec.rb
184
184
  - spec/unit/ipxact_spec.rb
185
185
  - spec/unit/platform_spec.rb
186
- - README.html
187
- - README.mdown
188
186
  has_rdoc: true
189
187
  homepage: http://tima-sls.imag.fr/www/research/ipxact/
190
188
  licenses: []
191
189
 
192
- post_install_message:
190
+ post_install_message: "\n (\"-._UPGRADING_.-\")\n\n\
191
+ Thank you for installing IP-Xact Ruby - 0.14.0.\n\
192
+ Please make sure you have a look at http://tima-sls.imag.fr/www/research/ipxact/upgrading/\n\
193
+ for upgrade info!\n\n \n"
193
194
  rdoc_options: []
194
195
 
195
196
  require_paths:
@@ -222,8 +223,102 @@ test_files:
222
223
  - spec/integration/data_calculation_spec.rb
223
224
  - spec/integration/data_construction_spec.rb
224
225
  - spec/integration/general_spec.rb
226
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.h
227
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.tpp
228
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port_base.h
229
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.h
230
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.tpp
231
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.h
232
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.tpp
233
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port.h
234
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port_base.h
235
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_tlm_if.h
236
+ - spec/test_data/spiritconsortium.org/Leon2TLM/PV/user_types.h
237
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/Leon2Platform.xml
238
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/design_Leon2Platform.xml
239
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/tlmsrc/Leon2Platform.h
240
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/apbSubSystem.xml
241
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/design_apbSubSystem.xml
242
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/tlmsrc/apbSubSystem.h
243
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/Leon2Platform.xml
244
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/design_Leon2Platform.xml
245
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/tlmsrc/Leon2Platform.h
246
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/apbSubSystem.xml
247
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/designConfig_apbSubSystem.xml
248
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/design_apbSubSystem.xml
249
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/tlmsrc/apbSubSystem.h
250
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/Leon2Platform.xml
251
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/design_Leon2Platform.xml
252
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/tlmsrc/Leon2Platform.h
253
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/apbSubSystem.xml
254
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/designConfig_apbSubSystem.xml
255
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/design_apbSubSystem.xml
256
+ - spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/tlmsrc/apbSubSystem.h
257
+ - spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/ahbbus22.xml
258
+ - spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/tlmsrc/ahbbus.h
259
+ - spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/ahbram.xml
260
+ - spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.cc
261
+ - spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.h
262
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/apbbus8.xml
263
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/tlmsrc/apbbus.h
264
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/apbmst.xml
265
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/tlmsrc/apbmst.h
266
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/apbram.xml
267
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.cc
268
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.h
269
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.v
270
+ - spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.vhd
271
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/cgu.xml
272
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.cc
273
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.h
274
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/cgu.xml
275
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.cc
276
+ - spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.h
277
+ - spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/dma.xml
278
+ - spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.cc
279
+ - spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.h
280
+ - spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/irqctrl.xml
281
+ - spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.cc
282
+ - spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.h
283
+ - spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/processor.xml
284
+ - spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.cc
285
+ - spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.h
286
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/pv2apb.xml
287
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.cc
288
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.h
289
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/pv2tac.xml
290
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.cc
291
+ - spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.h
292
+ - spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/rgu.xml
293
+ - spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.cc
294
+ - spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.h
295
+ - spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/scmlAdaptor.xml
296
+ - spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.cc
297
+ - spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.h
298
+ - spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/serial_device.xml
299
+ - spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/tlmsrc/serial_device.h
300
+ - spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/timers.xml
301
+ - spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.cc
302
+ - spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.h
303
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart.h
304
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_fifo.h
305
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_memory_map.h
306
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_types.h
307
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart.cc
308
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_interrupt_handler.cc
309
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_register_bank.cc
310
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_serial_tx_rx.cc
311
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/uart_scml.xml
312
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/Leon2_uart.h
313
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/def_Leon2_uart.h
314
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_field.h
315
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_register.h
316
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlmreg_Leon2_uart.h
317
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/Leon2_uart.cc
318
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/tlmreg_Leon2_uart.cc
319
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/user_specific_Leon2_uart.cc
320
+ - spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/uart_tac.xml
225
321
  - spec/unit/component_spec.rb
226
- - spec/unit/graph_pathfinder_spec.rb
227
322
  - spec/unit/identifier_spec.rb
228
323
  - spec/unit/interconnect_spec.rb
229
324
  - spec/unit/ipxact_spec.rb
@@ -1,191 +0,0 @@
1
- # Copyright (C) 2010 TIMA Laboratory
2
- #
3
- # This program is free software: you can redistribute it and/or modify
4
- # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation, either version 3 of the License, or
6
- # (at your option) any later version.
7
- #
8
- # This program is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU General Public License
14
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
- #
16
-
17
- # {IPXACT::GraphPathFinder} instances are used by {IPXACT::Component} instances
18
- # for handling Branch-And-Bound type data path searches within a given IPXACT
19
- # architecture. The {IPXACT::Component} is responsible for translating the IPXACT
20
- # architecture into a list of connections and transition weights, which may
21
- # then be queried for optimal paths between two nodes from the connection
22
- # graph. As such, even though the path finder is pretty generic, it should not
23
- # be used directly for IPXACT-related work.
24
- #
25
- # @example
26
- # @pathfinder = IPXACT::GraphPathFinder.new({
27
- # :nodes => ['component_a', 'component_b', 'component_c']
28
- # :connections =>
29
- # [
30
- # {:link => [0,1]},
31
- # {:link => [1,2], :cost => 2},
32
- # {:link => [2,0]}
33
- # ]
34
- # })
35
- # @data_path = @pathfinder.resolve('component_a', 'component_b')
36
- #
37
- # @author Guillaume Godet-Bar
38
- #
39
- class IPXACT::GraphPathFinder
40
-
41
- # The initializer is essentially used for passing a structured connection
42
- # Hash.
43
- #
44
- # @param [Hash] hash the connection Hash, which should be structured as follows:
45
- #
46
- # :nodes - An Array of node names (String).
47
- #
48
- # :connections - An Array of connection elements, which are defined as
49
- # :link - A 2-element Array, which describes an oriented
50
- # connection between two nodes. The nodes are
51
- # expressed using their index in the :nodes
52
- # Array.
53
- # :cost - A positive Integer expressing the cost of
54
- # the transition (in the sense of a
55
- # Branch-And-Bound algorithm) (optional,
56
- # default: 1).
57
- #
58
- def initialize(hash)
59
- @hash = hash
60
- end
61
-
62
- # Searches an optimal path between the start and _end elements, which
63
- # should be defined in the Hash structured used for instanciating the
64
- # {IPXACT::GraphPathFinder} instance. Optimal should be understood as "the
65
- # cheapest path given the cost of each connection". Additionally, validates
66
- # the latter Hash structure before executing the search algorithm.
67
- #
68
- # @param [String] start a String that corresponds to an element that was
69
- # registered when the pathfinder was created. The latter will be used
70
- # as the start node by the pathfinder algorithm.
71
- # @param [String] _end a String that corresponds to an element that was
72
- # registered when the pathfinder was created. The latter will be used
73
- # as the target node by the pathfinder algorithm.
74
- #
75
- # @return [Array<Integer>] an Array of Integers corresponding to connection
76
- # indices for the optimal data path between the +start+ and +_end+
77
- # elements, or an empty Array if the +start+ and +_end+ elements are
78
- # identical.
79
- #
80
- # @raise an exception if the Hash structure for the connections is empty.
81
- # @raise an exception unless all the node names are unique.
82
- # @raise an exception if the start or end element does not exist.
83
- # @raise an exception if no optimal data path could be found.
84
- #
85
- def resolve(start, _end)
86
- raise "Empty connection table!" if @hash.empty?
87
- return [] if start == _end
88
- raise "Duplicate connection node found!" if @hash[:nodes].uniq.size != @hash[:nodes].size
89
- raise "The source or target node does not exist!" unless @hash[:nodes].include?(start) && @hash[:nodes].include?(_end)
90
-
91
- @interconnect_table = (0..@hash[:nodes].size - 1).collect do |i|
92
- (0..@hash[:nodes].size - 1).collect do |j|
93
- result_hash = {
94
- :connection =>
95
- @hash[:connections].any?{|connection| connection[:link] == [j,i]},
96
- :total => Float::INFINITY,
97
- :previous => nil
98
- }
99
- if @hash[:connections].any?{|connection| connection[:link] == [j,i]}
100
- result = @hash[:connections].select{|connection| connection[:link] == [j,i]}.first[:cost] || 1
101
- result_hash.merge!({:cost => result})
102
- end
103
-
104
- result_hash
105
- end
106
- end
107
-
108
- start_index = @hash[:nodes].index(start)
109
- end_index = @hash[:nodes].index(_end)
110
- @interconnect_table[start_index][start_index][:total] = 0
111
-
112
-
113
- rec_resolve([start_index, start_index], end_index, 0)
114
-
115
- last_writer_index = nil
116
- @interconnect_table[end_index].each_with_index do |el, i|
117
- last_writer_index = i if el[:total] < Float::INFINITY
118
- end
119
- raise "Destination could not be reached!" if last_writer_index.nil?
120
-
121
-
122
- dump_trajectory(end_index).reverse
123
-
124
- end
125
-
126
- private
127
-
128
- # Recursive function for the pathfinder search algorithm.
129
- #
130
- # @param [Array] current the current node that is being traversed by the
131
- # algorithm.
132
- # @param [Integer] _end the index of the target node.
133
- # @param [Integer] current_total current Integer cost of the trajectory that
134
- # is being explored by this branch of the algorithm.
135
- #
136
- def rec_resolve(current, _end, current_total)
137
- current_writer_index = current[0]
138
- (0..@interconnect_table.size - 1).each do |i|
139
- if @interconnect_table[i][current_writer_index][:connection]
140
- new_total = current_total + (@interconnect_table[i][current_writer_index][:cost] || 1)
141
-
142
- if @interconnect_table[i][current_writer_index][:total] > new_total
143
- @interconnect_table[i][current_writer_index] = {:total => new_total, :connection => true, :previous => current.reverse}
144
-
145
- unless @interconnect_table[_end].any?{|el| el[:total] < new_total}
146
- rec_resolve([i, current_writer_index], _end, new_total)
147
- end
148
- end
149
- end
150
- end
151
- end
152
-
153
- # Scans the interconnect table, starting with the end_index, and traces a
154
- # trajectory back to its source, using the traceback references in each cell
155
- # from the interconnect table. The source cell is considered as the cell for
156
- # which there is no traceback reference.
157
- #
158
- # @param [Integer] end_index an Integer that corresponds to the last
159
- # element (from the original Hash structure) for which there
160
- # should be a trajectory calculated by the search algorithm.
161
- #
162
- # @return [Array<Integer>] the connection indices from the original Hash
163
- # structure.
164
- #
165
- def dump_trajectory(end_index)
166
- result = []
167
-
168
- # Get the path with the cheapest result
169
- min_element = @interconnect_table[end_index].min{|a,b| a[:total] <=> b[:total]}
170
- min_index = @interconnect_table[end_index].index(min_element)
171
-
172
- previous = [min_index, end_index]
173
- begin
174
- connection_index = @hash[:connections].index(@hash[:connections].detect{|el| el[:link] == previous})
175
- result << connection_index unless connection_index.nil?
176
- previous = @interconnect_table[previous[1]][previous[0]][:previous]
177
- end while not previous.nil?
178
-
179
- result
180
- end
181
-
182
- # Commodity method for printing the interconnect table during the execution of the search algorigthm.
183
- #
184
- def dump_table
185
- @interconnect_table.inject('') do |row_acc, row|
186
- row_acc + "\n" + row.inject('') do |col_acc, col|
187
- col_acc + (col[:total] == Float::INFINITY ? 'I' : col[:total].to_s) + " | "
188
- end
189
- end
190
- end
191
- end
@@ -1,128 +0,0 @@
1
- # Copyright (C) 2010 TIMA Laboratory
2
- #
3
- # This program is free software: you can redistribute it and/or modify
4
- # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation, either version 3 of the License, or
6
- # (at your option) any later version.
7
- #
8
- # This program is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU General Public License
14
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
- #
16
-
17
- require File.join File.dirname(__FILE__), '../../lib/ipxact'
18
-
19
-
20
- describe IPXACT::GraphPathFinder do
21
-
22
- before(:each) do
23
- @simple_graph = {
24
- :nodes => ['component_a', 'component_b', 'component_c',
25
- 'component_d'],
26
- :connections =>
27
- [
28
- {:link => [0,1], :via => 'connect_1'},
29
- {:link => [1,2], :via => 'connect_2'},
30
- {:link => [2,0], :via => 'connect_3.1'},
31
- {:link => [2,3], :via => 'connect_3.2'}
32
- ]
33
- }
34
-
35
- @complete_graph = {
36
- :nodes => ['i_proc', 'i_ahb', 'i_dma', 'i_sub', 'i_mem',
37
- 'i_cgu', 'i_rgu'],
38
- :connections =>
39
- [
40
- {:link => [0,1], :via => 'connect_1'},
41
- {:link => [2,1], :via => 'connect_2'},
42
- {:link => [1,4], :via => 'connect_3'},
43
- {:link => [1,3], :via => 'connect_4'},
44
- {:link => [3,0], :via => 'connect_5'},
45
- {:link => [3,5], :via => 'connect_6'},
46
- {:link => [3,6], :via => 'connect_7'},
47
- {:link => [3,2], :via => 'connect_8'}
48
- ]
49
- }
50
-
51
- @cheapest_path_graph = {
52
- :nodes => ['component_a', 'component_b', 'component_c',
53
- 'component_d'],
54
- :connections =>
55
- [
56
- {:link => [0,1], :via => 'connect_1'},
57
- {:link => [1,2], :cost => 8, :via => 'connect_expensive'},
58
- {:link => [2,3], :via => 'connect_2'},
59
- {:link => [1,3], :cost => 9, :via => 'connect_cheaper'}
60
- ]
61
- }
62
- end
63
-
64
- context "incorrect graph/arguments" do
65
- it "should return an exception when the graph is empty" do
66
- finder = IPXACT::GraphPathFinder.new({})
67
- lambda {
68
- finder.resolve('component_a', 'component_b')
69
- }.should raise_exception
70
- end
71
-
72
- it "should return an exception if any component is not unique" do
73
- @simple_graph[:nodes][1] = 'component_a'
74
- finder = IPXACT::GraphPathFinder.new @simple_graph
75
- lambda {
76
- finder.resolve('component_a', 'component_c')
77
- }.should raise_exception
78
- end
79
-
80
- it "should return an exception if the source or target component does not exist" do
81
- finder = IPXACT::GraphPathFinder.new @simple_graph
82
- lambda {
83
- finder.resolve('component_a', 'component_z')
84
- }.should raise_exception
85
- lambda {
86
- finder.resolve('component_z', 'component_a')
87
- }.should raise_exception
88
- end
89
-
90
- end
91
-
92
- context "graph pathfinding" do
93
- it "should return an empty array if the source equals the destination" do
94
- finder = IPXACT::GraphPathFinder.new @simple_graph
95
- finder.resolve('component_a', 'component_a').should eql([])
96
- end
97
-
98
- it "should return an array with a single element if the source is right next to the destination" do
99
- finder = IPXACT::GraphPathFinder.new(@simple_graph)
100
- finder.resolve('component_a', 'component_b').should eql([0])
101
- finder.resolve('component_c', 'component_a').should eql([2])
102
- end
103
-
104
- it "should raise an exception if the destination cannot be reached" do
105
- finder = IPXACT::GraphPathFinder.new(@simple_graph)
106
- lambda {
107
- finder.resolve('component_d', 'component_a')
108
- }.should raise_exception
109
- end
110
-
111
- it "should return a correct path from a simple graph" do
112
- finder = IPXACT::GraphPathFinder.new(@simple_graph)
113
- finder.resolve('component_a', 'component_d').should eql([0,1,3])
114
- end
115
-
116
- it "should be able to favor a cheaper path" do
117
- finder = IPXACT::GraphPathFinder.new(@cheapest_path_graph)
118
- finder.resolve('component_a', 'component_d').should eql([0,3])
119
- end
120
-
121
- it "should return a correct path from a realistic connection graph" do
122
- finder = IPXACT::GraphPathFinder.new(@complete_graph)
123
- finder.resolve('i_proc', 'i_dma').should eql([0,3,7])
124
- finder.resolve('i_dma', 'i_proc').should eql([1,3,4])
125
- end
126
-
127
- end
128
- end