xml: More tests for convert_and_merge script.

 * Full test which should include most features at once.
 * Fixing pack-pattern tests.
 * Update composable tests.

Signed-off-by: Tim 'mithro' Ansell <me@mith.ro>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3786bf8..0f8cf86 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,13 @@
 include("xsl_tests.cmake")
+# Test individual parts of the transform
 xsl_golden_test(NAME "attribute-cleanup")
-xsl_golden_test(NAME "composable-interconnect-fasm-mux-levels")
 xsl_golden_test(NAME "composable-interconnect-fasm-mux")
+xsl_golden_test(NAME "composable-interconnect-fasm-mux-levels")
 xsl_golden_test(NAME "composable-interconnect-implicit-parent")
 xsl_golden_test(NAME "composable-loc-implicit-parent")
+xsl_golden_test(NAME "explicit-port")
 xsl_golden_test(NAME "pack_pattern-merge-type-into-name")
 xsl_golden_test(NAME "pack_pattern-strip-from-pb_type-ports")
-xsl_golden_test(NAME "xml-explicit-port")
+# Test everything used together in one big file
+add_file_target(FILE "full-test-inner.xml" SCANNER_TYPE xml)
+xsl_golden_test(NAME "full-test")
diff --git a/attribute-cleanup.xml b/attribute-cleanup.xml
index decb65e..ed9a595 100644
--- a/attribute-cleanup.xml
+++ b/attribute-cleanup.xml
@@ -1,4 +1,9 @@
 <?xml version="1.0"?>
+<!-- Clean up attributes
+   * Normalize space around attributes on a tag
+   * Sort the attributes by name
+   * Strip xml:base attribute
+  -->
 <xml>
  <tag b="1"  c="123"  x="abc" />
  <tag c="1"  d="123"  x="abc" />
diff --git a/composable-interconnect-fasm-mux.golden.xml b/composable-interconnect-fasm-mux.golden.xml
new file mode 100644
index 0000000..4883664
--- /dev/null
+++ b/composable-interconnect-fasm-mux.golden.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<xml>
+  <pb_type name="parent">
+    <input name="i0"/>
+    <input name="i1"/>
+    <output name="o"/>
+    <pb_type name="child">
+      <input name="i"/>
+      <output name="o"/>
+    </pb_type>
+    <interconnect>
+      <direct name="parent-o" output="parent.o" input="child.o"/>
+      <mux name="mux1" input="parent.i0 parent.i1" output="child.i">
+        <metadata>
+          <meta name="fasm_mux">
+            parent.i0 : a1
+            parent.i1 : b1
+        </meta>
+          <meta name="fasm_name">fasm_name</meta>
+        </metadata>
+      </mux>
+    </interconnect>
+  </pb_type>
+</xml>
diff --git a/composable-interconnect-implicit-parent.golden.xml b/composable-interconnect-implicit-parent.golden.xml
new file mode 100644
index 0000000..da10541
--- /dev/null
+++ b/composable-interconnect-implicit-parent.golden.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<xml>
+  <pb_type name="parent">
+    <input name="ia1"/>
+    <input name="ia2"/>
+    <input name="ia3"/>
+    <output name="o0"/>
+    <output name="o1"/>
+    <pb_type name="childa">
+      <input name="i1"/>
+      <input name="i2"/>
+      <output name="o"/>
+    </pb_type>
+    <pb_type name="childb">
+      <input name="i"/>
+      <output name="o"/>
+    </pb_type>
+    <pb_type name="childc">
+      <input name="i"/>
+      <output name="o"/>
+    </pb_type>
+    <interconnect>
+      <direct input="parent.ia1" name="childa-i1" output="childa.i1"/>
+      <mux name="childa-input-i2" input="parent.ia2 parent.ia3" output="childa.i2">
+        <metadata>
+          <meta name="fasm_mux">
+            parent.ia2 : 
+            parent.ia3 : 
+        </meta>
+        </metadata>
+      </mux>
+      <direct input="childa.o" name="parent-o0" output="parent.o0"/>
+      <direct input="childa.o" name="childb-i" output="childb.i"/>
+      <mux name="childc-input" input="childa.o childb.o" output="childc.i">
+        <metadata>
+          <meta name="fasm_mux">
+            childa.o : 
+            childb.o : 
+        </meta>
+        </metadata>
+      </mux>
+      <mux name="output" input="childa.o childb.o childc.o" output="parent.o1">
+        <metadata>
+          <meta name="fasm_mux">
+            childa.o : 
+            childb.o : 
+            childc.o : 
+        </meta>
+        </metadata>
+      </mux>
+    </interconnect>
+  </pb_type>
+</xml>
diff --git a/composable-interconnect-implicit-parent.xml b/composable-interconnect-implicit-parent.xml
index a9ab9f5..5d8a28c 100644
--- a/composable-interconnect-implicit-parent.xml
+++ b/composable-interconnect-implicit-parent.xml
@@ -1,25 +1,95 @@
 <?xml version="1.0"?>
+<!--
+  Convert "implicit" parent specification for interconnect tags.
+
+  Convert
+    <interconnect><direct><port type='input' ...><port type='output' ...></direct><YYY../></interconnect>
+  to
+    <interconnect><direct input='...' name='xxx-xxx' output='...'><YYY../></direct></interconnect>
+
+  Convert
+    <interconnect><mux><port type='input' ...><port type='input' ...><port type='output' ...></mux><YYY../></interconnect>
+  to
+    <interconnect><mux input='in1 in2' name='xxx-xxx' output='...'><YYY../></mux></interconnect>
+
+This example below is connected as follows;
+     ┌───────────────────────────────────────────────────────────────────┐
+     │                                                                   │
+     │       ┌────────────┐                                              │
+  ia1│──────>│i1          │                                              │
+     │       │            │                                              │
+     │       │   childa  o│─┬───────────────────────────────────────────>│o0
+  ia2│──>│╲  │            │ │                                            │
+     │   │├─>│i2          │ │                                            │
+  ia3│──>│╱  └────────────┘ │  ┌──────────┐                              │
+     │                      ├─>│i childb o│─┬──>│╲                       │
+     │                      │  └──────────┘ │   ││   ┌──────────┐        │
+     │                      │               │   │├──>│i childc o│──>│╲   │
+     │                      ├──────────────────>││   └──────────┘   ││   │
+     │                      │               │   │╱                  ││   │
+     │                      │               │             ╭────────>│├──>│o1
+     │                      │               ╰─────────────╯         ││   │
+     │                      │                                       ││   │
+     │                      ╰──────────────────────────────────────>│/   │
+     │                                                                   │
+     └───────────────────────────────────────────────────────────────────┘
+  -->
 <xml>
  <pb_type name="parent">
-  <input name="i0" />
-  <input name="i1" />
-  <output name="o" />
-
-  <pb_type name="child">
-   <input name="i" />
-   <output name="o" />
+  <input name="ia1"/>
+  <input name="ia2"/>
+  <input name="ia3"/>
+  <output name="o0"/>
+  <output name="o1"/>
+  <pb_type name="childa">
+    <input name="i1"/>
+    <input name="i2"/>
+    <output name="o"/>
   </pb_type>
-
+  <pb_type name="childb">
+    <input name="i"/>
+    <output name="o"/>
+    </pb_type>
+    <pb_type name="childc">
+    <input name="i"/>
+    <output name="o"/>
+  </pb_type>
   <interconnect>
-   <direct>
-    <port type="output" name="o" />
-    <port type="input" from="child" name="o" />
-   </direct>
-   <mux name="mux1">
-    <port type="input" name="i0" />
-    <port type="input" name="i1" />
-    <port type="output" from="child" name="i" />
-   </mux>
- </interconnect>
+    <!-- Direct parent -> child -->
+    <direct>
+     <port type="input"                name="ia1" />
+     <port type="output" from="childa" name="i1"  />
+    </direct>
+    <!-- Mux parent -> child -->
+    <mux name="childa-input-i2">
+     <port type="input"                name="ia2" />
+     <port type="input"                name="ia3" />
+     <port type="output" from="childa" name="i2"  />
+    </mux>
+    <!-- Direct parent -> child -->
+    <direct>
+     <port type="input"  from="childa" name="o"   />
+     <port type="output"               name="o0"  />
+    </direct>
+    <!-- Direct child -> child -->
+    <direct>
+     <port type="input"  from="childa" name="o"   />
+     <port type="output" from="childb" name="i"   />
+    </direct>
+    <!-- Mux child -> child -->
+    <mux name="childc-input">
+     <port type="input"  from="childa" name="o"   />
+     <port type="input"  from="childb" name="o"   />
+     <port type="output" from="childc" name="i"   />
+    </mux>
+    <!-- Mux child -> parent -->
+    <mux name="output">
+     <port type="input"  from="childa" name="o"   />
+     <port type="input"  from="childb" name="o"   />
+     <port type="input"  from="childc" name="o"   />
+     <port type="output"               name="o1"  />
+    </mux>
+  </interconnect>
  </pb_type>
 </xml>
+
diff --git a/composable-loc-implicit-parent.golden.xml b/composable-loc-implicit-parent.golden.xml
new file mode 100644
index 0000000..0f993d1
--- /dev/null
+++ b/composable-loc-implicit-parent.golden.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<xml>
+  <pb_type name="parent">
+    <input name="i" width="2"/>
+    <loc>
+      parent.o
+      parent.i[0]
+      parent.i[1]
+    </loc>
+  </pb_type>
+</xml>
diff --git a/composable-loc-implicit-parent.xml b/composable-loc-implicit-parent.xml
index d148f05..9440379 100644
--- a/composable-loc-implicit-parent.xml
+++ b/composable-loc-implicit-parent.xml
@@ -1,4 +1,10 @@
 <?xml version="1.0"?>
+<!--
+  Convert
+    <loc ...><port ...><port ...></loc>
+  to
+    <loc ...>BLOCK.PORT BLOCK.PORT</loc>
+  -->
 <xml>
  <pb_type name="parent">
   <input name="i" width="2" />
diff --git a/explicit-port.golden.xml b/explicit-port.golden.xml
new file mode 100644
index 0000000..59cdf12
--- /dev/null
+++ b/explicit-port.golden.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<xml>
+  <port-value-test o="port-name"/>
+  <port-value-test o="port-name[8]"/>
+  <port-value-test o="port-name[8:4]"/>
+</xml>
diff --git a/explicit-port.xml b/explicit-port.xml
new file mode 100644
index 0000000..d078fea
--- /dev/null
+++ b/explicit-port.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- Convert
+   * <port name=XXX>                         to XXX
+   * <port name=XXX bit=Y>                   to XXX[Y]
+   * <port name=XXX bit-msb=M bit-lsb=L>     to XXX[M:L]
+  -->
+<xml>
+  <port-value-test><port name="port-name" /></port-value-test>
+  <port-value-test><port name="port-name" bit="8" /></port-value-test>
+  <port-value-test><port name="port-name" bit-msb="8" bit-lsb="4" /></port-value-test>
+</xml>
diff --git a/full-test-inner.xml b/full-test-inner.xml
new file mode 100644
index 0000000..5b44106
--- /dev/null
+++ b/full-test-inner.xml
@@ -0,0 +1,13 @@
+<pb_type xmlns:xi="http://www.w3.org/2001/XInclude" name="ADDER" blif_model=".subckt adder" num_pb="1">
+  <input name="a" num_pins="1"/>
+  <input name="b" num_pins="1"/>
+  <input name="cin" num_pins="1"/>
+  <output name="cout" num_pins="1"/>
+  <output name="sum" num_pins="1"/>
+  <delay_constant max="300e-12" in_port="a" out_port="cout"/>
+  <delay_constant max="300e-12" in_port="b" out_port="cout"/>
+  <delay_constant max="10e-12" in_port="cin" out_port="cout"/>
+  <delay_constant max="300e-12" in_port="a" out_port="sum"/>
+  <delay_constant max="300e-12" in_port="b" out_port="sum"/>
+  <delay_constant max="300e-12" in_port="cin" out_port="sum"/>
+</pb_type>
diff --git a/full-test.golden.xml b/full-test.golden.xml
new file mode 100644
index 0000000..c94d281
--- /dev/null
+++ b/full-test.golden.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<pb_type xmlns:xi="http://www.w3.org/2001/XInclude" name="MULTIPLE_INSTANCE" num_pb="1">
+  <input name="a" num_pins="4"/>
+  <input name="b" num_pins="4"/>
+  <input name="c" num_pins="4"/>
+  <input name="cin" num_pins="1"/>
+  <input name="d" num_pins="4"/>
+  <output name="cout" num_pins="1"/>
+  <output name="sum" num_pins="8"/>
+  <pb_type blif_model=".subckt adder" name="comba" num_pb="4">
+    <input name="a" num_pins="1"/>
+    <input name="b" num_pins="1"/>
+    <input name="cin" num_pins="1"/>
+    <output name="cout" num_pins="1"/>
+    <output name="sum" num_pins="1"/>
+    <delay_constant in_port="comba.a" max="300e-12" out_port="comba.cout"/>
+    <delay_constant in_port="comba.b" max="300e-12" out_port="comba.cout"/>
+    <delay_constant in_port="comba.cin" max="10e-12" out_port="comba.cout"/>
+    <delay_constant in_port="comba.a" max="300e-12" out_port="comba.sum"/>
+    <delay_constant in_port="comba.b" max="300e-12" out_port="comba.sum"/>
+    <delay_constant in_port="comba.cin" max="300e-12" out_port="comba.sum"/>
+  </pb_type>
+  <pb_type blif_model=".subckt adder" name="combb" num_pb="4">
+    <input name="a" num_pins="1"/>
+    <input name="b" num_pins="1"/>
+    <input name="cin" num_pins="1"/>
+    <output name="cout" num_pins="1"/>
+    <output name="sum" num_pins="1"/>
+    <delay_constant in_port="combb.a" max="300e-12" out_port="combb.cout"/>
+    <delay_constant in_port="combb.b" max="300e-12" out_port="combb.cout"/>
+    <delay_constant in_port="combb.cin" max="10e-12" out_port="combb.cout"/>
+    <delay_constant in_port="combb.a" max="300e-12" out_port="combb.sum"/>
+    <delay_constant in_port="combb.b" max="300e-12" out_port="combb.sum"/>
+    <delay_constant in_port="combb.cin" max="300e-12" out_port="combb.sum"/>
+  </pb_type>
+  <interconnect>
+    <direct input="MULTIPLE_INSTANCE.a[3]" name="comba[3]-a" output="comba[3].a"/>
+    <direct input="MULTIPLE_INSTANCE.b[3]" name="comba[3]-b" output="comba[3].b"/>
+    <direct input="MULTIPLE_INSTANCE.cin" name="comba[0]-cin" output="comba[0].cin"/>
+    <direct input="MULTIPLE_INSTANCE.cin" name="comba[1]-cin" output="comba[1].cin"/>
+    <direct input="MULTIPLE_INSTANCE.cin" name="comba[2]-cin" output="comba[2].cin"/>
+    <direct input="MULTIPLE_INSTANCE.cin" name="comba[3]-cin" output="comba[3].cin"/>
+    <direct input="comba[3].sum" name="MULTIPLE_INSTANCE-sum[3]" output="MULTIPLE_INSTANCE.sum[3]"/>
+    <direct input="MULTIPLE_INSTANCE.a[0]" name="comba[0]-a" output="comba[0].a"/>
+    <direct input="MULTIPLE_INSTANCE.b[0]" name="comba[0]-b" output="comba[0].b"/>
+    <direct input="comba[0].sum" name="MULTIPLE_INSTANCE-sum[0]" output="MULTIPLE_INSTANCE.sum[0]"/>
+    <direct input="MULTIPLE_INSTANCE.a[1]" name="comba[1]-a" output="comba[1].a"/>
+    <direct input="MULTIPLE_INSTANCE.b[1]" name="comba[1]-b" output="comba[1].b"/>
+    <direct input="comba[1].sum" name="MULTIPLE_INSTANCE-sum[1]" output="MULTIPLE_INSTANCE.sum[1]"/>
+    <direct input="MULTIPLE_INSTANCE.a[2]" name="comba[2]-a" output="comba[2].a"/>
+    <direct input="MULTIPLE_INSTANCE.b[2]" name="comba[2]-b" output="comba[2].b"/>
+    <direct input="comba[2].sum" name="MULTIPLE_INSTANCE-sum[2]" output="MULTIPLE_INSTANCE.sum[2]"/>
+    <direct input="MULTIPLE_INSTANCE.c[0]" name="combb[0]-a" output="combb[0].a"/>
+    <direct input="MULTIPLE_INSTANCE.d[0]" name="combb[0]-b" output="combb[0].b"/>
+    <direct input="comba[0].cout" name="combb[0]-cin" output="combb[0].cin">
+      <pack_pattern name="carry-ADDER" in_port="comba[0].cout" out_port="combb[0].cin"/>
+    </direct>
+    <direct input="combb[0].sum" name="MULTIPLE_INSTANCE-sum[4]" output="MULTIPLE_INSTANCE.sum[4]"/>
+    <direct input="MULTIPLE_INSTANCE.c[1]" name="combb[1]-a" output="combb[1].a"/>
+    <direct input="MULTIPLE_INSTANCE.d[1]" name="combb[1]-b" output="combb[1].b"/>
+    <direct input="comba[1].cout" name="combb[1]-cin" output="combb[1].cin">
+      <pack_pattern name="carry-ADDER" in_port="comba[1].cout" out_port="combb[1].cin"/>
+    </direct>
+    <direct input="combb[1].sum" name="MULTIPLE_INSTANCE-sum[5]" output="MULTIPLE_INSTANCE.sum[5]"/>
+    <direct input="MULTIPLE_INSTANCE.c[2]" name="combb[2]-a" output="combb[2].a"/>
+    <direct input="MULTIPLE_INSTANCE.d[2]" name="combb[2]-b" output="combb[2].b"/>
+    <direct input="comba[2].cout" name="combb[2]-cin" output="combb[2].cin">
+      <pack_pattern name="carry-ADDER" in_port="comba[2].cout" out_port="combb[2].cin"/>
+    </direct>
+    <direct input="combb[2].sum" name="MULTIPLE_INSTANCE-sum[6]" output="MULTIPLE_INSTANCE.sum[6]"/>
+    <direct input="MULTIPLE_INSTANCE.c[3]" name="combb[3]-a" output="combb[3].a"/>
+    <direct input="MULTIPLE_INSTANCE.d[3]" name="combb[3]-b" output="combb[3].b"/>
+    <direct input="comba[3].cout" name="combb[3]-cin" output="combb[3].cin">
+      <pack_pattern name="carry-ADDER" in_port="comba[3].cout" out_port="combb[3].cin"/>
+    </direct>
+    <direct input="combb[3].cout" name="MULTIPLE_INSTANCE-cout" output="MULTIPLE_INSTANCE.cout"/>
+    <direct input="combb[3].sum" name="MULTIPLE_INSTANCE-sum[7]" output="MULTIPLE_INSTANCE.sum[7]"/>
+  </interconnect>
+</pb_type>
diff --git a/full-test.xml b/full-test.xml
new file mode 100644
index 0000000..ca3ef54
--- /dev/null
+++ b/full-test.xml
@@ -0,0 +1,166 @@
+<?xml version='1.0' encoding='utf-8'?>
+<pb_type xmlns:xi="http://www.w3.org/2001/XInclude" name="MULTIPLE_INSTANCE" num_pb="1">
+  <input name="a" num_pins="4"/>
+  <input name="b" num_pins="4"/>
+  <input name="c" num_pins="4"/>
+  <input name="cin" num_pins="1"/>
+  <input name="d" num_pins="4"/>
+  <output name="cout" num_pins="1"/>
+  <output name="sum" num_pins="8"/>
+  <pb_type blif_model=".subckt adder" name="comba" num_pb="4">
+    <xi:include href="full-test-inner.xml" xpointer="xpointer(pb_type/child::node())"/>
+  </pb_type>
+  <pb_type blif_model=".subckt adder" name="combb" num_pb="4">
+    <xi:include href="full-test-inner.xml" xpointer="xpointer(pb_type/child::node())"/>
+  </pb_type>
+  <interconnect>
+    <direct>
+      <port name="a[3]" type="input"/>
+      <port from="comba[3]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="b[3]" type="input"/>
+      <port from="comba[3]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port name="cin" type="input"/>
+      <port from="comba[0]" name="cin" type="output"/>
+    </direct>
+    <direct>
+      <port name="cin" type="input"/>
+      <port from="comba[1]" name="cin" type="output"/>
+    </direct>
+    <direct>
+      <port name="cin" type="input"/>
+      <port from="comba[2]" name="cin" type="output"/>
+    </direct>
+    <direct>
+      <port name="cin" type="input"/>
+      <port from="comba[3]" name="cin" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[3]" name="sum" type="input"/>
+      <port name="sum[3]" type="output"/>
+    </direct>
+    <direct>
+      <port name="a[0]" type="input"/>
+      <port from="comba[0]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="b[0]" type="input"/>
+      <port from="comba[0]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[0]" name="sum" type="input"/>
+      <port name="sum[0]" type="output"/>
+    </direct>
+    <direct>
+      <port name="a[1]" type="input"/>
+      <port from="comba[1]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="b[1]" type="input"/>
+      <port from="comba[1]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[1]" name="sum" type="input"/>
+      <port name="sum[1]" type="output"/>
+    </direct>
+    <direct>
+      <port name="a[2]" type="input"/>
+      <port from="comba[2]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="b[2]" type="input"/>
+      <port from="comba[2]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[2]" name="sum" type="input"/>
+      <port name="sum[2]" type="output"/>
+    </direct>
+    <direct>
+      <port name="c[0]" type="input"/>
+      <port from="combb[0]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="d[0]" type="input"/>
+      <port from="combb[0]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[0]" name="cout" type="input"/>
+      <port from="combb[0]" name="cin" type="output"/>
+      <pack_pattern name="ADDER" type="carry">
+        <port from="comba[0]" name="cout" type="input"/>
+        <port from="combb[0]" name="cin" type="output"/>
+      </pack_pattern>
+    </direct>
+    <direct>
+      <port from="combb[0]" name="sum" type="input"/>
+      <port name="sum[4]" type="output"/>
+    </direct>
+    <direct>
+      <port name="c[1]" type="input"/>
+      <port from="combb[1]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="d[1]" type="input"/>
+      <port from="combb[1]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[1]" name="cout" type="input"/>
+      <port from="combb[1]" name="cin" type="output"/>
+      <pack_pattern name="ADDER" type="carry">
+        <port from="comba[1]" name="cout" type="input"/>
+        <port from="combb[1]" name="cin" type="output"/>
+      </pack_pattern>
+    </direct>
+    <direct>
+      <port from="combb[1]" name="sum" type="input"/>
+      <port name="sum[5]" type="output"/>
+    </direct>
+    <direct>
+      <port name="c[2]" type="input"/>
+      <port from="combb[2]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="d[2]" type="input"/>
+      <port from="combb[2]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[2]" name="cout" type="input"/>
+      <port from="combb[2]" name="cin" type="output"/>
+      <pack_pattern name="ADDER" type="carry">
+        <port from="comba[2]" name="cout" type="input"/>
+        <port from="combb[2]" name="cin" type="output"/>
+      </pack_pattern>
+    </direct>
+    <direct>
+      <port from="combb[2]" name="sum" type="input"/>
+      <port name="sum[6]" type="output"/>
+    </direct>
+    <direct>
+      <port name="c[3]" type="input"/>
+      <port from="combb[3]" name="a" type="output"/>
+    </direct>
+    <direct>
+      <port name="d[3]" type="input"/>
+      <port from="combb[3]" name="b" type="output"/>
+    </direct>
+    <direct>
+      <port from="comba[3]" name="cout" type="input"/>
+      <port from="combb[3]" name="cin" type="output"/>
+      <pack_pattern name="ADDER" type="carry">
+        <port from="comba[3]" name="cout" type="input"/>
+        <port from="combb[3]" name="cin" type="output"/>
+      </pack_pattern>
+    </direct>
+    <direct>
+      <port from="combb[3]" name="cout" type="input"/>
+      <port name="cout" type="output"/>
+    </direct>
+    <direct>
+      <port from="combb[3]" name="sum" type="input"/>
+      <port name="sum[7]" type="output"/>
+    </direct>
+  </interconnect>
+</pb_type>
diff --git a/pack_pattern-merge-type-into-name.golden.xml b/pack_pattern-merge-type-into-name.golden.xml
index 34abd19..f93626e 100644
--- a/pack_pattern-merge-type-into-name.golden.xml
+++ b/pack_pattern-merge-type-into-name.golden.xml
@@ -2,10 +2,10 @@
 <xml>
   <pb_type>
     <direct>
-      <pack_pattern name="carry-B"/>
+      <pack_pattern name="chain-B"/>
     </direct>
     <mux>
-      <pack_pattern name="pack-A">
+      <pack_pattern name="molecule-A">
         <innertag/>
       </pack_pattern>
     </mux>
diff --git a/pack_pattern-merge-type-into-name.xml b/pack_pattern-merge-type-into-name.xml
index ae102ea..040ce3a 100644
--- a/pack_pattern-merge-type-into-name.xml
+++ b/pack_pattern-merge-type-into-name.xml
@@ -1,11 +1,21 @@
 <?xml version="1.0"?>
+<!--
+  Convert
+     <pack_pattern name="xxx" type="yyy
+  to
+     <pack_pattern name="yyy-xxx"
+
+  The idea is that eventually VPR will be explicit about chain and molecule
+  patterns.
+
+  -->
 <xml>
  <pb_type>
   <direct>
-   <pack_pattern name="B" type="carry" />
+   <pack_pattern name="B" type="chain" />
   </direct>
   <mux>
-   <pack_pattern name="A" type="pack">
+   <pack_pattern name="A" type="molecule" >
     <innertag />
    </pack_pattern>
   </mux>
diff --git a/pack_pattern-strip-from-pb_type-ports.xml b/pack_pattern-strip-from-pb_type-ports.xml
index 988de09..da6866a 100644
--- a/pack_pattern-strip-from-pb_type-ports.xml
+++ b/pack_pattern-strip-from-pb_type-ports.xml
@@ -1,4 +1,12 @@
 <?xml version="1.0"?>
+<!--
+  Strip pack_pattern's from input/output tags on pb_types.
+
+  This allows us to add the pack_pattern annotation at the leaf values which
+  don't have an interconnect. It makes it explicit which ports are involved in
+  the chain (and hence won't end up on fabric).
+
+  -->
 <xml>
  <pb_type>
   <input name="in1">
diff --git a/xml-explicit-port.golden.xml b/xml-explicit-port.golden.xml
deleted file mode 100644
index 2bd3d8f..0000000
--- a/xml-explicit-port.golden.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0"?>
-<xml>
-port-name
-port-name[8]
-port-name[8:4]
-</xml>
diff --git a/xml-explicit-port.xml b/xml-explicit-port.xml
index a58530f..d078fea 100644
--- a/xml-explicit-port.xml
+++ b/xml-explicit-port.xml
@@ -1,6 +1,11 @@
 <?xml version="1.0"?>
+<!-- Convert
+   * <port name=XXX>                         to XXX
+   * <port name=XXX bit=Y>                   to XXX[Y]
+   * <port name=XXX bit-msb=M bit-lsb=L>     to XXX[M:L]
+  -->
 <xml>
-  <port name="port-name" />
-  <port name="port-name" bit="8" />
-  <port name="port-name" bit_msb="8" bit_lsb="4" />
+  <port-value-test><port name="port-name" /></port-value-test>
+  <port-value-test><port name="port-name" bit="8" /></port-value-test>
+  <port-value-test><port name="port-name" bit-msb="8" bit-lsb="4" /></port-value-test>
 </xml>
diff --git a/xsl_tests.cmake b/xsl_tests.cmake
index 65d02d1..e50c50b 100644
--- a/xsl_tests.cmake
+++ b/xsl_tests.cmake
@@ -5,19 +5,20 @@
   # ~~~
   # XSL_GOLDEN_TEST(
   #   NAME name
-  #   TOP_MODULE name
   #   )
   # ~~~
   #
-  # This function is to test both the pb_type XML generation. It will call V2X_TEST_GENERIC multiple times first with the field TYPE set to `pb_type`
-  # then with `model`
+  # This function is to test the xml_canonicalize_merge function which uses the
+  # convert_and_merge_composable_fpga_architecture.xsl script correctly
+  # transforms XML by comparing against a golden output file.
   #
   # NAME name of the test.
-  # TOP_MODULE name of the top verilog module that has to be tested.
   #
-  # Usage: v2x_test_model(NAME <test_name> TOP_MODULE <top_module.v>) (All fields are required)
+  # Usage: xsl_golden_testl(NAME <test_name>)
 
-  set(oneValueArgs NAME TOP_MODULE)
+  set(options "")
+  set(oneValueArgs NAME)
+  set(multiValueArgs "")
   cmake_parse_arguments(
     XSL_GOLDEN_TEST
     "${options}"
@@ -27,13 +28,17 @@
   )
 
   set(NAME ${XSL_GOLDEN_TEST_NAME})
-  set(TOP_MODULE ${XSL_GOLDEN_TEST_TOP_MODULE})
 
   set(INPUT_XML ${NAME}.xml)
   add_file_target(FILE ${INPUT_XML} SCANNER_TYPE xml)
 
   set(ACTUAL_XML ${NAME}.actual.xml)
-  xml_canonicalize_merge(NAME merge_${ACTUAL_XML} FILE ${INPUT_XML} OUTPUT ${ACTUAL_XML})
+  xml_canonicalize_merge(
+    NAME merge_${ACTUAL_XML}
+    FILE ${INPUT_XML}
+    OUTPUT ${ACTUAL_XML}
+    EXTRA_ARGUMENTS "-param" "strip_comments" "1"
+    )
 
   set(GOLDEN_XML ${NAME}.golden.xml)
   add_file_target(FILE ${GOLDEN_XML} SCANNER_TYPE xml)