ipxact-ruby 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/.autotest +15 -0
  2. data/.gitignore +2 -0
  3. data/README.html +89 -0
  4. data/README.mdown +91 -0
  5. data/Rakefile +31 -0
  6. data/VERSION +1 -0
  7. data/autotest/discover.rb +17 -0
  8. data/lib/ipxact.rb +263 -0
  9. data/lib/ipxact/component.rb +235 -0
  10. data/lib/ipxact/parser.rb +27 -0
  11. data/lib/ipxact/parser/bus_data_parser.rb +229 -0
  12. data/lib/ipxact/parser/component_data_parser.rb +309 -0
  13. data/lib/ipxact/parser/platform_data_parser.rb +63 -0
  14. data/lib/ipxact/pathfinder/graph_pathfinder.rb +191 -0
  15. data/lib/ipxact/platform.rb +43 -0
  16. data/schemas/abstractionDefinition.xsd +332 -0
  17. data/schemas/abstractor.xsd +156 -0
  18. data/schemas/autoConfigure.xsd +226 -0
  19. data/schemas/busDefinition.xsd +99 -0
  20. data/schemas/busInterface.xsd +640 -0
  21. data/schemas/commonStructures.xsd +189 -0
  22. data/schemas/component.xsd +253 -0
  23. data/schemas/configurable.xsd +82 -0
  24. data/schemas/constraints.xsd +283 -0
  25. data/schemas/design.xsd +105 -0
  26. data/schemas/designConfig.xsd +144 -0
  27. data/schemas/file.xsd +560 -0
  28. data/schemas/fileType.xsd +86 -0
  29. data/schemas/generator.xsd +240 -0
  30. data/schemas/identifier.xsd +93 -0
  31. data/schemas/index.xsd +67 -0
  32. data/schemas/memoryMap.xsd +1007 -0
  33. data/schemas/model.xsd +291 -0
  34. data/schemas/port.xsd +441 -0
  35. data/schemas/signalDrivers.xsd +220 -0
  36. data/schemas/simpleTypes.xsd +90 -0
  37. data/schemas/subInstances.xsd +256 -0
  38. data/spec/integration/bus_data_extraction_spec.rb +105 -0
  39. data/spec/integration/data_calculation_spec.rb +133 -0
  40. data/spec/integration/data_construction_spec.rb +52 -0
  41. data/spec/integration/general_spec.rb +121 -0
  42. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.h +135 -0
  43. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port.tpp +247 -0
  44. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_initiator_port_base.h +189 -0
  45. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.h +205 -0
  46. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_router.tpp +278 -0
  47. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.h +115 -0
  48. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_slave_base.tpp +126 -0
  49. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port.h +168 -0
  50. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_target_port_base.h +133 -0
  51. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/pv_tlm_if.h +280 -0
  52. data/spec/test_data/spiritconsortium.org/Leon2TLM/PV/user_types.h +38 -0
  53. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/Leon2Platform.xml +77 -0
  54. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/design_Leon2Platform.xml +156 -0
  55. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/Leon2Platform/tlmsrc/Leon2Platform.h +149 -0
  56. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/apbSubSystem.xml +406 -0
  57. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/design_apbSubSystem.xml +135 -0
  58. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM1/apbSubSystem/tlmsrc/apbSubSystem.h +133 -0
  59. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/Leon2Platform.xml +77 -0
  60. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/design_Leon2Platform.xml +157 -0
  61. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/Leon2Platform/tlmsrc/Leon2Platform.h +150 -0
  62. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/apbSubSystem.xml +422 -0
  63. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/designConfig_apbSubSystem.xml +79 -0
  64. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/design_apbSubSystem.xml +184 -0
  65. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM2/apbSubSystem/tlmsrc/apbSubSystem.h +164 -0
  66. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/Leon2Platform.xml +105 -0
  67. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/design_Leon2Platform.xml +157 -0
  68. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/Leon2Platform/tlmsrc/Leon2Platform.h +152 -0
  69. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/apbSubSystem.xml +429 -0
  70. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/designConfig_apbSubSystem.xml +64 -0
  71. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/design_apbSubSystem.xml +150 -0
  72. data/spec/test_data/spiritconsortium.org/Leon2TLM/SystemTLM3/apbSubSystem/tlmsrc/apbSubSystem.h +167 -0
  73. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/ahbbus22.xml +236 -0
  74. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbbus/1.4/tlmsrc/ahbbus.h +52 -0
  75. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/ahbram.xml +184 -0
  76. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.cc +93 -0
  77. data/spec/test_data/spiritconsortium.org/Leon2TLM/ahbram/1.4/tlmsrc/ahbram.h +77 -0
  78. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/apbbus8.xml +544 -0
  79. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbbus/1.4/tlmsrc/apbbus.h +55 -0
  80. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/apbmst.xml +209 -0
  81. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbmst/1.4/tlmsrc/apbmst.h +53 -0
  82. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/apbram.xml +395 -0
  83. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.cc +89 -0
  84. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.h +69 -0
  85. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.v +82 -0
  86. data/spec/test_data/spiritconsortium.org/Leon2TLM/apbram/1.0/hdlsrc/apbram.vhd +132 -0
  87. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/cgu.xml +686 -0
  88. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.cc +121 -0
  89. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.4/tlmsrc/cgu.h +81 -0
  90. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/cgu.xml +707 -0
  91. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.cc +121 -0
  92. data/spec/test_data/spiritconsortium.org/Leon2TLM/cgu/1.5/tlmsrc/cgu.h +81 -0
  93. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/dma.xml +272 -0
  94. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.cc +230 -0
  95. data/spec/test_data/spiritconsortium.org/Leon2TLM/dma/1.4/tlmsrc/dma.h +116 -0
  96. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/irqctrl.xml +530 -0
  97. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.cc +211 -0
  98. data/spec/test_data/spiritconsortium.org/Leon2TLM/irqctrl/1.4/tlmsrc/irqctrl.h +108 -0
  99. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/processor.xml +423 -0
  100. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.cc +331 -0
  101. data/spec/test_data/spiritconsortium.org/Leon2TLM/processor/1.4/tlmsrc/processor.h +121 -0
  102. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/pv2apb.xml +240 -0
  103. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.cc +153 -0
  104. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2apb/1.0/tlmsrc/pv2apb.h +77 -0
  105. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/pv2tac.xml +154 -0
  106. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.cc +114 -0
  107. data/spec/test_data/spiritconsortium.org/Leon2TLM/pv2tac/1.0/tlmsrc/pv2tac.h +67 -0
  108. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/rgu.xml +766 -0
  109. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.cc +126 -0
  110. data/spec/test_data/spiritconsortium.org/Leon2TLM/rgu/1.4/tlmsrc/rgu.h +105 -0
  111. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/scmlAdaptor.xml +154 -0
  112. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.cc +100 -0
  113. data/spec/test_data/spiritconsortium.org/Leon2TLM/scmlAdaptor/1.0/tlmsrc/scmladaptor.h +62 -0
  114. data/spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/serial_device.xml +151 -0
  115. data/spec/test_data/spiritconsortium.org/Leon2TLM/serial_device/1.0/tlmsrc/serial_device.h +85 -0
  116. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/timers.xml +460 -0
  117. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.cc +201 -0
  118. data/spec/test_data/spiritconsortium.org/Leon2TLM/timers/1.4/tlmsrc/timers.h +102 -0
  119. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart.h +152 -0
  120. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_fifo.h +113 -0
  121. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_memory_map.h +96 -0
  122. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/inc/uart_types.h +60 -0
  123. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart.cc +125 -0
  124. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_interrupt_handler.cc +136 -0
  125. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_register_bank.cc +129 -0
  126. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/tlmsrc/src/uart_serial_tx_rx.cc +145 -0
  127. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_scml/1.0/uart_scml.xml +372 -0
  128. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/Leon2_uart.h +216 -0
  129. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/def_Leon2_uart.h +34 -0
  130. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_field.h +72 -0
  131. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlm_register.h +129 -0
  132. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/include/tlmreg_Leon2_uart.h +133 -0
  133. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/Leon2_uart.cc +316 -0
  134. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/tlmreg_Leon2_uart.cc +197 -0
  135. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/tlmsrc/src/user_specific_Leon2_uart.cc +146 -0
  136. data/spec/test_data/spiritconsortium.org/Leon2TLM/uart_tac/1.0/uart_tac.xml +222 -0
  137. data/spec/unit/component_spec.rb +98 -0
  138. data/spec/unit/graph_pathfinder_spec.rb +128 -0
  139. data/spec/unit/interconnect_spec.rb +177 -0
  140. data/spec/unit/ipxact_spec.rb +69 -0
  141. data/spec/unit/platform_spec.rb +34 -0
  142. metadata +225 -0
data/.autotest ADDED
@@ -0,0 +1,15 @@
1
+
2
+ require 'autotest/growl'
3
+
4
+ Autotest.add_hook(:initialize) {|at|
5
+ at.add_exception %r{^\.git} # ignore Version Control System
6
+ at.add_exception %r{^./tmp} # ignore temp files, lest autotest will run again, and again...
7
+ at.clear_mappings # take out the default (test/test*rb)
8
+ at.add_mapping(%r{^.*\.rb$}) {|f, _|
9
+ Dir['spec/**/*.rb']
10
+ }
11
+ at.add_mapping(%r{^ipxact/.*\.rb$}) {|f, _|
12
+ Dir['spec/*.rb']
13
+ }
14
+ nil
15
+ }
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ cscope.files
data/README.html ADDED
@@ -0,0 +1,89 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html PUBLIC
3
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
4
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
5
+ <html xml:lang='en' xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/1999/xhtml'>
6
+ <head><meta content='application/xhtml+xml;charset=utf-8' http-equiv='Content-type' /><title>IPXACT-Ruby</title><link href='style.css' rel='stylesheet' type='text/css' />
7
+ </head>
8
+ <body>
9
+ <h1 id='ipxactruby'>IPXACT-Ruby</h1>
10
+
11
+ <p><strong>IPXACT-Ruby</strong> is a ruby library for extracting data from an <strong>IPXACT</strong> platform description. It was developed at <a href='http://tima-sls.imag.fr'>TIMA Laboratory</a>, France, for simplifying recurring platform parsing tasks. As such, this gem relies heavily on Aaron Patterson&#8217;s <a href='http://nokogiri.org'>Nokogiri gem</a> for parsing the XML data. This gem also provides methods for computing values that cannot be explicitly defined using the <strong>IPXACT</strong> format, such as component base addresses, relative to other components. Finally, please note that, in its current state, the <strong>IPXACT-Ruby</strong> gem does not handle all the aspects of the <strong>IPXACT</strong> format, but focuses on its <strong>Component</strong> and <strong>Design</strong> concepts .</p>
12
+
13
+ <h2 id='history'>History</h2>
14
+
15
+ <p>XXX Latest changes</p>
16
+
17
+ <h2 id='ipxact_format'>IPXACT format</h2>
18
+
19
+ <p><strong>IPXACT</strong> is an XML format for describing electronic components and their designs. First managed by the SPIRIT Consortium, the evolution of the format is now supervised by <a href='http://www.accelera.org'>Accelera</a>. Additionally, the <strong>IPXACT</strong> format is now an IEEE standard, under the reference <a href='http://standards.ieee.org/getieee/1685/index.html'>IEEE-1685</a>. Its full specification may be downloaded <a href='http://www.accellera.org/pressroom/2010/Get_1685_01Jun10.pdf'>here</a>.</p>
20
+
21
+ <h2 id='basic_usage'>Basic Usage</h2>
22
+
23
+ <p>An IPXACT platform is basically composed of two types of elements:</p>
24
+
25
+ <ul>
26
+ <li>
27
+ <p>Component files, which describe the structure of an IPXACT component</p>
28
+
29
+ <p>component_docs = IPXACT::load_components(COMPONENT_PATH) design_docs = IPXACT::load_designs(DESIGN_PATH)</p>
30
+ </li>
31
+
32
+ <li>
33
+ <p>Design files</p>
34
+ </li>
35
+ </ul>
36
+
37
+ <p>The whole platform will then be parsed by the IPXACT gem:</p>
38
+
39
+ <pre><code>platform = IPXACT::Parser::PlatformData.parse_platform(&lt;platform_name&gt;, component_docs, design_docs)</code></pre>
40
+
41
+ <p>Or if you&#8217;d rather specify the platform&#8217;s version that should be loaded:</p>
42
+
43
+ <pre><code>platform = IPXACT::Parser::PlatformData.parse_platform([&lt;platform_name&gt;, &lt;platform_version&gt;], \
44
+ component_docs, design_docs)</code></pre>
45
+
46
+ <p>In most cases, when methods require identifying a component you may use either specification:</p>
47
+
48
+ <ul>
49
+ <li><code>&lt;component_name&gt;</code> will fetch the most recent component.</li>
50
+
51
+ <li><code>[&lt;component_name, &lt;component_version&gt;]</code> wil get the component with the specified version, thus allowing different component versions to coexist in the same path.</li>
52
+ </ul>
53
+
54
+ <p>Additionally, the same approach may be used for setting parsing constraints, which are passed as a final argument (<code>Array</code>) to the <code>parse_platform</code> method.</p>
55
+
56
+ <p>When builder the platform object, IPXACT will combine component and design descriptions, identify hierarchical components and parse subcomponents when possible. In fact, in platform should be considered as a component except for a basic method aliasing (the <code>subcomponents</code> and <code>subcomponents=</code> methods are respectively aliased to <code>components</code> and <code>components=</code>, for the sake of DSL legibility). Thus, a component is composed of:</p>
57
+
58
+ <ul>
59
+ <li><code>subcomponents</code></li>
60
+
61
+ <li><code>ports</code></li>
62
+
63
+ <li><code>interconnections</code>, which define how its subcomponents are connected with one another.</li>
64
+
65
+ <li><code>hierconnections</code>, which correspond the components&#8217; connections between its ports and its subcomponents.</li>
66
+ </ul>
67
+
68
+ <p>For more information, please refer to the specs provided with the gem.</p>
69
+
70
+ <h2 id='installation'>Installation</h2>
71
+
72
+ <p>Standard gem install command:</p>
73
+
74
+ <pre><code>gem install ipxact</code></pre>
75
+
76
+ <h2 id='support'>Support</h2>
77
+
78
+ <ul>
79
+ <li>guillaume (dot) godetbar (at) gmail (dot) com</li>
80
+ </ul>
81
+
82
+ <h2 id='license'>License</h2>
83
+
84
+ <p>Copyright (C) 2010 TIMA Laboratory</p>
85
+
86
+ <p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>
87
+
88
+ <p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>
89
+ </body></html>
data/README.mdown ADDED
@@ -0,0 +1,91 @@
1
+ CSS: style.css
2
+
3
+
4
+ IPXACT-Ruby
5
+ ===========
6
+
7
+ **IPXACT-Ruby** is a ruby library for extracting data from an **IPXACT** platform description. It was developed at [TIMA Laboratory](http://tima-sls.imag.fr), France, for simplifying recurring platform parsing tasks. As such, this gem relies heavily on Aaron Patterson's [Nokogiri gem](http://nokogiri.org) for parsing the XML data. This gem also provides methods for computing values that cannot be explicitly defined using the **IPXACT** format, such as component base addresses, relative to other components.
8
+ Finally, please note that, in its current state, the **IPXACT-Ruby** gem does not handle all the aspects of the **IPXACT** format, but focuses on its **Component** and **Design** concepts .
9
+
10
+
11
+ History
12
+ -------
13
+
14
+ XXX Latest changes
15
+
16
+
17
+ IPXACT format
18
+ -------------
19
+
20
+ **IPXACT** is an XML format for describing electronic components and their designs. First managed by the SPIRIT Consortium, the evolution of the format is now supervised by [Accelera](http://www.accelera.org). Additionally, the **IPXACT** format is now an IEEE standard, under the reference [IEEE-1685](http://standards.ieee.org/getieee/1685/index.html). Its full specification may be downloaded [here](http://www.accellera.org/pressroom/2010/Get_1685_01Jun10.pdf).
21
+
22
+
23
+ Basic Usage
24
+ -----------
25
+ An IPXACT platform is basically composed of two types of elements:
26
+
27
+ * Component files, which describe the structure of an IPXACT component
28
+
29
+
30
+ component_docs = IPXACT::load_components(COMPONENT_PATH)
31
+ design_docs = IPXACT::load_designs(DESIGN_PATH)
32
+
33
+ * Design files
34
+
35
+ The whole platform will then be parsed by the IPXACT gem:
36
+
37
+ platform = IPXACT::Parser::PlatformData.parse_platform(<platform_name>, component_docs, design_docs)
38
+
39
+ Or if you'd rather specify the platform's version that should be loaded:
40
+
41
+ platform = IPXACT::Parser::PlatformData.parse_platform([<platform_name>, <platform_version>], \
42
+ component_docs, design_docs)
43
+
44
+ In most cases, when methods require identifying a component you may use either specification:
45
+
46
+ * `<component_name>` will fetch the most recent component.
47
+ * `[<component_name, <component_version>]` wil get the component with the specified version, thus allowing different component versions to coexist in the same path.
48
+
49
+ Additionally, the same approach may be used for setting parsing constraints, which are passed as a final argument (`Array`) to the `parse_platform` method.
50
+
51
+ When builder the platform object, IPXACT will combine component and design
52
+ descriptions, identify hierarchical components and parse subcomponents when
53
+ possible. In fact, in platform should be considered as a component except for a
54
+ basic method aliasing (the `subcomponents` and `subcomponents=` methods are
55
+ respectively aliased to `components` and `components=`, for the sake of DSL
56
+ legibility). Thus, a component is composed of:
57
+
58
+ * `subcomponents`
59
+ * `ports`
60
+ * `interconnections`, which define how its subcomponents are connected with one another.
61
+ * `hierconnections`, which correspond the components' connections between its ports and its subcomponents.
62
+
63
+ For more information, please refer to the specs provided with the gem.
64
+
65
+
66
+ Installation
67
+ ------------
68
+
69
+ Standard gem install command:
70
+
71
+ gem install ipxact-ruby
72
+
73
+ Support
74
+ -------
75
+
76
+ * guillaume (dot) godetbar (at) gmail (dot) com
77
+
78
+ License
79
+ -------
80
+
81
+ Copyright (C) 2010 TIMA Laboratory
82
+
83
+ This program is free software: you can redistribute it and/or modify
84
+ it under the terms of the GNU General Public License as published by
85
+ the Free Software Foundation, either version 3 of the License, or
86
+ (at your option) any later version.
87
+
88
+ This program is distributed in the hope that it will be useful,
89
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
90
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
91
+ GNU General Public License for more details.
data/Rakefile ADDED
@@ -0,0 +1,31 @@
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
+ begin
18
+ require 'jeweler'
19
+ Jeweler::Tasks.new do |gemspec|
20
+ gemspec.name = "ipxact-ruby"
21
+ gemspec.summary = "Ruby library for parsing IPXACT specifications and extracting relevant information."
22
+ gemspec.email = "guillaume.godetbar@gmail.com "
23
+ gemspec.homepage = "http://tima-sls.imag.fr"
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"]
26
+ gemspec.add_dependency 'nokogiri'
27
+ end
28
+ rescue LoadError
29
+ puts "Jeweler not available. Install it with: gem install jeweler"
30
+ end
31
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.11.1
@@ -0,0 +1,17 @@
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
+ Autotest.add_discovery { "rspec2" }
data/lib/ipxact.rb ADDED
@@ -0,0 +1,263 @@
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 'nokogiri'
18
+ require 'set'
19
+
20
+ # Root and commodity module for the IPXACT Ruby library. In particular, this
21
+ # module should be used for loading the component design files.
22
+ #
23
+ # @example Default initialization process
24
+ # component_docs = IPXACT::load_components("my/component/path")
25
+ # design_docs = IPXACT::load_designs("my/design/path")
26
+ # platform = IPXACT::Parser::PlatformData::parse_platform("platform_id",
27
+ # component_docs, design_docs)
28
+ # @author Guillaume Godet-Bar
29
+ #
30
+ module IPXACT
31
+
32
+ # Path to the +design.xsd+ file
33
+ DESIGN_SCHEMA_PATH = File.join File.dirname(__FILE__), '../schemas/design.xsd'
34
+
35
+ # Path to the +component.xsd+ file
36
+ COMPONENT_SCHEMA_PATH = File.join File.dirname(__FILE__), '../schemas/component.xsd'
37
+
38
+ # Returns whether the XML file is an IPXACT component (i.e., it is consistent
39
+ # with the +component.xsd+ schema.
40
+ #
41
+ # @param [String] file_path path to the file that should be tested
42
+ #
43
+ # @return [Boolean] whether the file is a valid IPXACT component
44
+ #
45
+ def self.is_valid_component?(path)
46
+ raise ArgumentError unless path.is_a? String
47
+
48
+ component_schema_file = File.open(COMPONENT_SCHEMA_PATH)
49
+ component_schema = Nokogiri::XML::Schema(component_schema_file)
50
+ component_schema_file.close
51
+
52
+ component_file = File.open(path)
53
+ component_doc = Nokogiri::XML(component_file)
54
+ component_file.close
55
+
56
+ component_schema.validate(component_doc).size == 0
57
+ end
58
+
59
+ # Returns whether the XML file is an IPXACT design (i.e., it is consistent
60
+ # with the +design.xsd+ schema).
61
+ #
62
+ # @param [String] file_path path to the file that should be tested
63
+ #
64
+ # @return [Boolean] whether the file is a valid IPXACT design
65
+ #
66
+ def self.is_valid_design?(path)
67
+ raise ArgumentError unless path.is_a? String
68
+
69
+ design_schema_file = File.open(DESIGN_SCHEMA_PATH)
70
+ design_schema = Nokogiri::XML::Schema design_schema_file
71
+ design_schema_file.close
72
+
73
+ design_file = File.open(path)
74
+ design_doc = Nokogiri::XML(design_file)
75
+ design_file.close
76
+
77
+ design_schema.validate(design_doc).size == 0
78
+ end
79
+
80
+ # Returns the component's identifier (i.e., name, library, vendor, version).
81
+ #
82
+ # @param [String] path The path to the component's XML file
83
+ #
84
+ # @return [Hash] The component's identifier or nil if the path is invalid
85
+ #
86
+ def self.identifier(path)
87
+ if is_valid_design?(path) || is_valid_component?(path)
88
+ ipxact_file = File.open(path)
89
+ ipxact_doc = Nokogiri::XML(ipxact_file)
90
+ ipxact_file.close
91
+
92
+ {
93
+ :name => ipxact_doc.xpath("./*/spirit:name").first.text,
94
+ :vendor => ipxact_doc.xpath("./*/spirit:vendor").first.text,
95
+ :library => ipxact_doc.xpath("./*/spirit:library").first.text,
96
+ :version => ipxact_doc.xpath("./*/spirit:version").first.text
97
+ }
98
+ else
99
+ nil
100
+ end
101
+ end
102
+
103
+
104
+ # Loads the components from an IPXACT XML specification.
105
+ #
106
+ # @param [String] components_path path to the components of the target
107
+ # platform. All subdirectories will be
108
+ # scanned and all valid files (i.e., from an
109
+ # XML and +component.xsd+ schema point of
110
+ # view) are loaded into the resulting
111
+ # structure.
112
+ #
113
+ # @return [Hash] a Hash that associates the name and version of the component
114
+ # with the IPXACT XML (Nokogiri) structure of the component. No
115
+ # post-processing is made on this structure, which should not be used for
116
+ # any serious work (i.e.,its values may be modified when instantiating any
117
+ # design file linked to the components).
118
+ # @raise a generic exception if no component could be found.
119
+ #
120
+ def self.load_components(components_path)
121
+ component_schema_file = File.open(COMPONENT_SCHEMA_PATH)
122
+ component_schema = Nokogiri::XML::Schema(component_schema_file)
123
+ component_schema_file.close
124
+
125
+ xml_files = Dir.glob(File.join(components_path, "**", "*.xml"))
126
+
127
+ component_docs = xml_files.inject({}) do |acc, file|
128
+ component_file = File.open(file)
129
+ component_doc = Nokogiri::XML(component_file)
130
+ component_file.close
131
+
132
+ version_tag = component_doc.xpath("/spirit:component/spirit:version")
133
+ version = version_tag.first.nil? ? "0" : version_tag.first.text
134
+
135
+ name_tag = component_doc.xpath("/spirit:component/spirit:name")
136
+ name = name_tag.first.nil? ? nil : name_tag.first.text
137
+
138
+ unless name.nil?
139
+ key = [component_doc.xpath("/spirit:component/spirit:name").first.text, version]
140
+ acc[key] = component_doc \
141
+ if component_schema.validate(component_doc).size == 0
142
+ end
143
+ acc
144
+ end
145
+
146
+ raise 'No valid component was found!' if component_docs.keys.empty?
147
+
148
+ component_docs
149
+ end
150
+
151
+ # Loads the designs from an IPXACT XML specification.
152
+ #
153
+ # @param [String] designs_path a path to the design instances of the target
154
+ # platform. All subdirectories will be scanned and all valid
155
+ # files (i.e., from an XML and design.xsd schema point of
156
+ # view) are loaded into the resulting structure.
157
+ #
158
+ # @return [Hash] a Hash that associates the name and version of the design
159
+ # with the IPXACT XML (Nokogiri) structure of the design. Should not be used,
160
+ # as this is 'raw' IPXACT data.
161
+ #
162
+ # @raise a generic exception if no design document could be found.
163
+ #
164
+ def self.load_designs(designs_path)
165
+ design_schema_file = File.open(DESIGN_SCHEMA_PATH)
166
+ design_schema = Nokogiri::XML::Schema design_schema_file
167
+ design_schema_file.close
168
+
169
+ xml_files = Dir.glob(File.join(designs_path, "**", "*.xml"))
170
+
171
+ design_docs = xml_files.inject({}) do |acc, xml_file|
172
+ design_file = File.open(xml_file)
173
+ design_doc = Nokogiri::XML(design_file)
174
+ design_file.close
175
+
176
+ if design_schema.validate(design_doc).size == 0
177
+
178
+ design_name = design_doc.xpath("./spirit:design/spirit:name").text
179
+ design_version = design_doc.xpath("./spirit:design/spirit:version").text
180
+
181
+ acc[[design_name, design_version]] = design_doc
182
+ end
183
+
184
+ acc
185
+ end
186
+
187
+ raise 'No valid design could be found!' if design_docs.keys.empty?
188
+
189
+ design_docs
190
+
191
+ end
192
+
193
+ # Decides whether version_a is strictly more recent than version_b. Accepts
194
+ # any relaxed version of semantic versioning markup (i.e., +X(\.Y(\.Z)?)?+).
195
+ #
196
+ # @param [String] version_a a version number
197
+ # @param [String] version_b a version number
198
+ #
199
+ # @return [Boolean] a Boolean that states if +version_a > version_b+
200
+ #
201
+ def self.is_most_recent_version?(version_a, version_b)
202
+ split_a = version_a.split('.')
203
+ split_b = version_b.split('.')
204
+
205
+ split_a.each_with_index do |el,i|
206
+ return true if split_b.size <= i && el.to_i != 0
207
+ return true if el.to_i > split_b[i].to_i
208
+ end
209
+
210
+ false
211
+ end
212
+
213
+ # Decides whether version_a and version_b are the same version. Accepts any
214
+ # relaxed version of the semantic versioning markup (i.e., +X(\.Y(\.Z)?)?+).
215
+ # When comparing versions with different lengths, the method will 'pad' the
216
+ # shortest version string with 0s.
217
+ #
218
+ # @example
219
+ # IPXACT::is_same_version('1.0', '1.1')
220
+ # # => false
221
+ #
222
+ # IPXACT::is_same_version('1.0', '1.0')
223
+ # # => true
224
+ #
225
+ # IPXACT::is_same_version('1.0.0', '1.0')
226
+ # # => true
227
+ #
228
+ # IPXACT::is_same_version('1.0.1', '1.0')
229
+ # # => false
230
+ #
231
+ # @return [Boolean] a Boolean that states if +version_a == version_b+
232
+ # (relaxed equivalence)
233
+ #
234
+ def self.is_same_version?(version_a, version_b)
235
+ return !(self.is_most_recent_version?(version_a, version_b) || self.is_most_recent_version?(version_b, version_a))
236
+ end
237
+
238
+ # Parses an IPXACT reference element (i.e., any +spirit:hierarchyRef+ or
239
+ # +spirit:componentRef+).
240
+ #
241
+ # @param [Nokogiri::Node] reference The IPXACT reference, as an XML
242
+ # (Nokogiri) fragment
243
+ #
244
+ # @return [Hash] a Hash with the following keys:
245
+ # +:library+ the referenced element's library;
246
+ # +:name+ the referenced element's name;
247
+ # +:vendor+ the referenced element's vendor;
248
+ # +:version+ the referenced element's version.
249
+ #
250
+ def self.parse_reference(reference)
251
+ {
252
+ :library => reference['library'],
253
+ :name => reference['name'],
254
+ :vendor => reference['vendor'],
255
+ :version => reference['version']
256
+ }
257
+ end
258
+ end
259
+
260
+ require File.join File.dirname(__FILE__), 'ipxact/parser'
261
+ require File.join File.dirname(__FILE__), 'ipxact/platform'
262
+ require File.join File.dirname(__FILE__), 'ipxact/pathfinder/graph_pathfinder'
263
+