ipxact-ruby 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+