[doc/rm] Crossbar Tool
Add `tlgen.py`, more generally `util/tlgen`, document to help
understanding how the crossbar is being generated in OpenTitan and its
usage.
To generate tlgen selfdoc, validate has checker logic inside. The
checking structure (control group) is slightly changed from its in
reggen. The change makes validate to run recursively and generate the
doc recursively.
This document addresses the issue #340.
diff --git a/doc/rm/crossbar_example_1.svg b/doc/rm/crossbar_example_1.svg
new file mode 100644
index 0000000..46da11a
--- /dev/null
+++ b/doc/rm/crossbar_example_1.svg
@@ -0,0 +1 @@
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 132.59055l0 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 132.59055l0 74.72064" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.55905 207.31119l-2.2491608 -2.249176l2.2491608 6.179535l2.249176 -6.179535z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 132.59055l-1.5118408 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 132.59055l-1.3848267 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 207.31236l-2.2070923 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 493.29135l-1.5118103 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 493.29135l-1.3847961 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 568.0131l-2.2071075 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 493.29135l-1.5118408 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 493.29135l-1.3848267 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 568.0131l-2.2070923 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 237.62993l0 232.18898" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 237.62993l0 232.18898" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 237.62993l0 232.18898" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 237.62993l0 232.18898" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m216.85503 234.19362l294.14172 239.0551" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m216.85503 234.19362l294.14172 239.0551" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m510.99274 234.19362l-294.14172 239.0551" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m510.99274 234.19362l-294.14172 239.0551" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m149.7874 90.76378l117.54332 0l0 41.826767l-117.54332 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m149.7874 90.76378l117.54332 0l0 41.826767l-117.54332 0z" fill-rule="evenodd"/><path fill="#000000" d="m179.2808 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm11.195572 -5.078125q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875zm7.492447 6.671875q0 -0.265625 0.078125 -0.5q0.09375 -0.25 0.25 -0.421875q0.171875 -0.1875 0.421875 -0.28125q0.25 -0.09375 0.578125 -0.09375q0.328125 0 0.578125 0.09375q0.25 0.09375 0.40625 0.28125q0.171875 0.171875 0.25 0.421875q0.09375 0.234375 0.09375 0.5q0 0.265625 -0.09375 0.5q-0.078125 0.234375 -0.25 0.40625q-0.15625 0.171875 -0.40625 0.265625q-0.25 0.09375 -0.578125 0.09375q-0.328125 0 -0.578125 -0.09375q-0.25 -0.09375 -0.421875 -0.265625q-0.15625 -0.171875 -0.25 -0.40625q-0.078125 -0.234375 -0.078125 -0.5zm0 -8.0q0 -0.265625 0.078125 -0.5q0.09375 -0.25 0.25 -0.421875q0.171875 -0.1875 0.421875 -0.28125q0.25 -0.09375 0.578125 -0.09375q0.328125 0 0.578125 0.09375q0.25 0.09375 0.40625 0.28125q0.171875 0.171875 0.25 0.421875q0.09375 0.234375 0.09375 0.5q0 0.265625 -0.09375 0.5q-0.078125 0.234375 -0.25 0.40625q-0.15625 0.171875 -0.40625 0.265625q-0.25 0.09375 -0.578125 0.09375q-0.328125 0 -0.578125 -0.09375q-0.25 -0.09375 -0.421875 -0.265625q-0.15625 -0.171875 -0.25 -0.40625q-0.078125 -0.234375 -0.078125 -0.5zm9.039322 -0.765625l0.046875 0.9375q0.296875 -0.53125 0.78125 -0.8125q0.5 -0.296875 1.1875 -0.296875q1.359375 0 1.8125 1.046875q0.296875 -0.46875 0.765625 -0.75q0.484375 -0.296875 1.15625 -0.296875q1.09375 0 1.671875 0.671875q0.578125 0.65625 0.578125 2.0l0 7.359375l-1.59375 0l0 -7.375q0 -1.25 -1.140625 -1.234375q-0.296875 0 -0.515625 0.09375q-0.21875 0.078125 -0.375 0.21875q-0.140625 0.140625 -0.21875 0.328125q-0.078125 0.1875 -0.109375 0.375l0 7.59375l-1.609375 0l0 -7.390625q0 -0.59375 -0.265625 -0.90625q-0.265625 -0.328125 -0.828125 -0.3125q-0.53125 0 -0.828125 0.21875q-0.28125 0.203125 -0.421875 0.546875l0 7.84375l-1.609375 0l0 -9.859375l1.515625 0zm16.898697 9.859375q-0.09375 -0.1875 -0.15625 -0.46875q-0.0625 -0.296875 -0.09375 -0.609375q-0.25 0.265625 -0.5625 0.5q-0.3125 0.21875 -0.703125 0.390625q-0.375 0.171875 -0.8125 0.265625q-0.421875 0.109375 -0.890625 0.109375q-0.796875 0 -1.4375 -0.21875q-0.625 -0.234375 -1.0625 -0.625q-0.4375 -0.390625 -0.6875 -0.921875q-0.234375 -0.53125 -0.234375 -1.15625q0 -0.8125 0.3125 -1.421875q0.328125 -0.609375 0.921875 -1.015625q0.59375 -0.40625 1.421875 -0.59375q0.84375 -0.203125 1.875 -0.203125l1.828125 0l0 -0.78125q0 -0.453125 -0.171875 -0.796875q-0.15625 -0.359375 -0.453125 -0.609375q-0.296875 -0.25 -0.734375 -0.390625q-0.421875 -0.140625 -0.96875 -0.140625q-0.5 0 -0.90625 0.140625q-0.390625 0.125 -0.671875 0.34375q-0.265625 0.203125 -0.421875 0.484375q-0.140625 0.28125 -0.140625 0.59375l-1.6875 0q0 -0.53125 0.265625 -1.046875q0.28125 -0.53125 0.78125 -0.9375q0.5 -0.421875 1.21875 -0.671875q0.734375 -0.25 1.65625 -0.25q0.84375 0 1.5625 0.203125q0.71875 0.203125 1.234375 0.625q0.53125 0.40625 0.828125 1.03125q0.296875 0.609375 0.296875 1.4375l0 4.578125q0 0.5 0.09375 1.046875q0.09375 0.546875 0.25 0.96875l0 0.140625l-1.75 0zm-2.984375 -1.28125q0.5 0 0.921875 -0.125q0.4375 -0.140625 0.78125 -0.34375q0.34375 -0.203125 0.59375 -0.46875q0.265625 -0.28125 0.40625 -0.5625l0 -2.0l-1.5625 0q-1.46875 0 -2.296875 0.4375q-0.8125 0.4375 -0.8125 1.375q0 0.359375 0.125 0.671875q0.125 0.3125 0.359375 0.53125q0.25 0.21875 0.625 0.359375q0.375 0.125 0.859375 0.125zm7.961197 -8.578125l5.046875 0l0 8.40625l3.21875 0l0 1.453125l-8.265625 0l0 -1.453125l3.359375 0l0 -6.9375l-3.359375 0l0 -1.46875zm3.140625 -2.578125q0 -0.421875 0.25 -0.703125q0.25 -0.296875 0.765625 -0.296875q0.5 0 0.75 0.296875q0.25 0.28125 0.25 0.703125q0 0.40625 -0.25 0.6875q-0.25 0.265625 -0.75 0.265625q-0.515625 0 -0.765625 -0.265625q-0.25 -0.28125 -0.25 -0.6875zm9.304947 2.578125l0.125 1.453125q0.53125 -0.765625 1.3125 -1.1875q0.78125 -0.4375 1.75 -0.4375q0.78125 0 1.40625 0.21875q0.640625 0.21875 1.078125 0.6875q0.453125 0.453125 0.6875 1.171875q0.25 0.71875 0.25 1.6875l0 6.265625l-1.6875 0l0 -6.21875q0 -0.65625 -0.15625 -1.109375q-0.140625 -0.453125 -0.421875 -0.734375q-0.28125 -0.296875 -0.703125 -0.421875q-0.40625 -0.125 -0.953125 -0.125q-0.84375 0 -1.484375 0.421875q-0.640625 0.421875 -1.03125 1.125l0 7.0625l-1.6875 0l0 -9.859375l1.515625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m457.8084 90.76378l122.96063 0l0 41.826767l-122.96063 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m457.8084 90.76378l122.96063 0l0 41.826767l-122.96063 0z" fill-rule="evenodd"/><path fill="#000000" d="m490.01047 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm8.336182 0l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625zm8.664337 -1.09375q0 -0.265625 0.078125 -0.5q0.09375 -0.25 0.25 -0.421875q0.171875 -0.1875 0.421875 -0.28125q0.25 -0.09375 0.578125 -0.09375q0.328125 0 0.578125 0.09375q0.25 0.09375 0.40625 0.28125q0.171875 0.171875 0.25 0.421875q0.09375 0.234375 0.09375 0.5q0 0.265625 -0.09375 0.5q-0.078125 0.234375 -0.25 0.40625q-0.15625 0.171875 -0.40625 0.265625q-0.25 0.09375 -0.578125 0.09375q-0.328125 0 -0.578125 -0.09375q-0.25 -0.09375 -0.421875 -0.265625q-0.15625 -0.171875 -0.25 -0.40625q-0.078125 -0.234375 -0.078125 -0.5zm0 -8.0q0 -0.265625 0.078125 -0.5q0.09375 -0.25 0.25 -0.421875q0.171875 -0.1875 0.421875 -0.28125q0.25 -0.09375 0.578125 -0.09375q0.328125 0 0.578125 0.09375q0.25 0.09375 0.40625 0.28125q0.171875 0.171875 0.25 0.421875q0.09375 0.234375 0.09375 0.5q0 0.265625 -0.09375 0.5q-0.078125 0.234375 -0.25 0.40625q-0.15625 0.171875 -0.40625 0.265625q-0.25 0.09375 -0.578125 0.09375q-0.328125 0 -0.578125 -0.09375q-0.25 -0.09375 -0.421875 -0.265625q-0.15625 -0.171875 -0.25 -0.40625q-0.078125 -0.234375 -0.078125 -0.5zm16.586182 4.28125q0 1.046875 -0.265625 1.96875q-0.25 0.90625 -0.75 1.59375q-0.484375 0.671875 -1.21875 1.0625q-0.71875 0.375 -1.640625 0.375q-0.90625 0 -1.59375 -0.296875q-0.6875 -0.296875 -1.171875 -0.84375l0 4.75l-1.6875 0l0 -13.65625l1.53125 0l0.09375 1.078125q0.484375 -0.609375 1.171875 -0.921875q0.703125 -0.328125 1.625 -0.328125q0.953125 0 1.671875 0.375q0.734375 0.359375 1.21875 1.03125q0.5 0.65625 0.75 1.59375q0.265625 0.921875 0.265625 2.015625l0 0.203125zm-1.6875 -0.203125q0 -0.71875 -0.171875 -1.359375q-0.15625 -0.65625 -0.484375 -1.15625q-0.328125 -0.5 -0.84375 -0.78125q-0.5 -0.296875 -1.21875 -0.296875q-0.8125 0 -1.359375 0.375q-0.546875 0.375 -0.875 0.96875l0 4.75q0.328125 0.578125 0.875 0.953125q0.546875 0.375 1.375 0.375q0.703125 0 1.203125 -0.296875q0.515625 -0.296875 0.84375 -0.796875q0.328125 -0.5 0.484375 -1.15625q0.171875 -0.65625 0.171875 -1.375l0 -0.203125zm8.914307 5.203125q-1.03125 0 -1.90625 -0.359375q-0.875 -0.359375 -1.5 -0.984375q-0.609375 -0.640625 -0.953125 -1.515625q-0.34375 -0.875 -0.34375 -1.90625l0 -0.390625q0 -1.1875 0.375 -2.125q0.390625 -0.953125 1.015625 -1.59375q0.640625 -0.65625 1.4375 -1.0q0.8125 -0.34375 1.65625 -0.34375q1.0625 0 1.859375 0.375q0.796875 0.359375 1.328125 1.015625q0.53125 0.640625 0.78125 1.53125q0.265625 0.875 0.265625 1.90625l0 0.75l-7.03125 0q0.015625 0.6875 0.25 1.28125q0.234375 0.578125 0.640625 1.03125q0.40625 0.4375 0.96875 0.703125q0.5625 0.25 1.25 0.25q0.90625 0 1.59375 -0.359375q0.703125 -0.375 1.171875 -0.96875l1.03125 0.796875q-0.25 0.375 -0.625 0.71875q-0.359375 0.328125 -0.84375 0.59375q-0.484375 0.265625 -1.09375 0.421875q-0.609375 0.171875 -1.328125 0.171875zm-0.21875 -8.84375q-0.515625 0 -0.96875 0.1875q-0.453125 0.1875 -0.8125 0.546875q-0.359375 0.359375 -0.625 0.890625q-0.25 0.515625 -0.34375 1.203125l5.296875 0l0 -0.125q-0.015625 -0.5 -0.1875 -0.984375q-0.15625 -0.484375 -0.46875 -0.859375q-0.296875 -0.390625 -0.765625 -0.625q-0.46875 -0.234375 -1.125 -0.234375zm13.523743 -1.375q0.234375 0 0.484375 0.015625q0.265625 0 0.484375 0.03125q0.234375 0.03125 0.421875 0.078125q0.203125 0.046875 0.34375 0.109375l-0.234375 1.640625q-0.484375 -0.109375 -0.9375 -0.15625q-0.4375 -0.046875 -0.921875 -0.046875q-1.1875 0 -1.921875 0.546875q-0.734375 0.53125 -1.078125 1.484375l0 6.328125l-1.6875 0l0 -9.859375l1.59375 0l0.09375 1.5625q0.59375 -0.796875 1.4375 -1.265625q0.84375 -0.46875 1.921875 -0.46875zm4.9924316 0.171875l5.046875 0l0 8.40625l3.21875 0l0 1.453125l-8.265625 0l0 -1.453125l3.359375 0l0 -6.9375l-3.359375 0l0 -1.46875zm3.140625 -2.578125q0 -0.421875 0.25 -0.703125q0.25 -0.296875 0.765625 -0.296875q0.5 0 0.75 0.296875q0.25 0.28125 0.25 0.703125q0 0.40625 -0.25 0.6875q-0.25 0.265625 -0.75 0.265625q-0.515625 0 -0.765625 -0.265625q-0.25 -0.28125 -0.25 -0.6875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m198.76973 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm17.976822 6.796875q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m509.4994 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm15.117432 11.875l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/></g></svg>
\ No newline at end of file
diff --git a/doc/rm/crossbar_example_2.svg b/doc/rm/crossbar_example_2.svg
new file mode 100644
index 0000000..389a8b5
--- /dev/null
+++ b/doc/rm/crossbar_example_2.svg
@@ -0,0 +1 @@
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 132.59055l-1.5118103 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 132.59055l-1.3847961 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 207.31236l-2.2071075 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 132.59055l-1.5118408 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 132.59055l-1.3848267 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 207.31236l-2.2070923 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 493.29135l-1.5118103 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 493.29135l-1.3847961 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 568.0131l-2.2071075 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 493.29135l-1.5118408 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 493.29135l-1.3848267 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 568.0131l-2.2070923 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 237.62993l0 232.18898" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 237.62993l0 232.18898" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m216.85503 309.50464l294.14172 163.74802" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m216.85503 309.50464l294.14172 163.74802" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m510.99274 234.19362l-294.14172 239.0551" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m510.99274 234.19362l-294.14172 239.0551" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m208.02563 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm11.195572 -5.078125q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m518.7553 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm8.336182 0l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m198.76973 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm17.976822 6.796875q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m509.4994 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm15.117432 11.875l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 312.94095l0 156.8819" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 312.94095l0 156.8819" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 280.2966l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 304.19498q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm8.3359375 2.875l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm12.0390625 0l-1.46875 0l-4.40625 -8.5l-0.03125 8.5l-1.453125 0l0 -11.375l1.46875 0l4.40625 8.484375l0.03125 -8.484375l1.453125 0l0 11.375zm9.4921875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/></g></svg>
\ No newline at end of file
diff --git a/doc/rm/crossbar_example_3.svg b/doc/rm/crossbar_example_3.svg
new file mode 100644
index 0000000..6d206a7
--- /dev/null
+++ b/doc/rm/crossbar_example_3.svg
@@ -0,0 +1 @@
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 132.59055l-1.5118103 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 132.59055l-1.3847961 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 207.31236l-2.2071075 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 132.59055l-1.5118408 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 132.59055l-1.3848267 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 207.31236l-2.2070923 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 481.55774l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 481.55774l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 493.29135l0 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 493.29135l0 74.72061" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.55905 568.01196l-2.2491608 -2.2491455l2.2491608 6.1795044l2.249176 -6.1795044z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 493.29004l0 81.57477" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 493.29004l0 74.72064" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.2887 568.0107l-2.2491455 -2.2492065l2.2491455 6.1795654l2.2492065 -6.1795654z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 237.62993l0 160.31496" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 237.62993l0 160.31496" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m510.99274 234.19362l-294.14172 163.74803" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m510.99274 234.19362l-294.14172 163.74803" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m208.02563 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm11.195572 -5.078125q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m518.7553 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm8.336182 0l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m198.76973 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm17.976822 6.796875q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m509.4994 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm15.117432 11.875l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 312.94095l0 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 312.94095l0 81.5748" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 280.2966l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 304.19498q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm8.3359375 2.875l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm12.0390625 0l-1.46875 0l-4.40625 -8.5l-0.03125 8.5l-1.453125 0l0 -11.375l1.46875 0l4.40625 8.484375l0.03125 -8.484375l1.453125 0l0 11.375zm9.4921875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 417.97375l0 51.84253" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 417.97375l0 51.84253" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 388.76117l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 388.76117l70.36218 0l0 41.82675l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m554.6078 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm9.7578125 -5.328125q0 0.90625 -0.21875 1.703125q-0.21875 0.78125 -0.640625 1.359375q-0.421875 0.578125 -1.046875 0.90625q-0.625 0.328125 -1.421875 0.328125q-0.8125 0 -1.421875 -0.28125q-0.59375 -0.296875 -1.015625 -0.84375l-0.0625 0.96875l-1.328125 0l0 -12.0l1.4375 0l0 4.453125q0.421875 -0.515625 1.0 -0.78125q0.59375 -0.28125 1.375 -0.28125q0.8125 0 1.4375 0.328125q0.625 0.3125 1.046875 0.890625q0.421875 0.5625 0.640625 1.359375q0.21875 0.78125 0.21875 1.734375l0 0.15625zm-1.453125 -0.15625q0 -0.625 -0.125 -1.171875q-0.109375 -0.5625 -0.375 -0.984375q-0.265625 -0.4375 -0.703125 -0.6875q-0.421875 -0.25 -1.046875 -0.25q-0.375 0 -0.6875 0.109375q-0.3125 0.09375 -0.5625 0.265625q-0.25 0.171875 -0.4375 0.421875q-0.1875 0.234375 -0.328125 0.515625l0 3.6875q0.140625 0.28125 0.328125 0.53125q0.203125 0.234375 0.453125 0.421875q0.25 0.171875 0.5625 0.265625q0.3125 0.09375 0.6875 0.09375q0.59375 0 1.015625 -0.234375q0.421875 -0.25 0.6875 -0.671875q0.28125 -0.421875 0.40625 -0.96875q0.125 -0.5625 0.125 -1.1875l0 -0.15625z" fill-rule="nonzero"/></g></svg>
\ No newline at end of file
diff --git a/doc/rm/crossbar_example_4.svg b/doc/rm/crossbar_example_4.svg
new file mode 100644
index 0000000..61b5680
--- /dev/null
+++ b/doc/rm/crossbar_example_4.svg
@@ -0,0 +1 @@
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 132.59055l-1.5118103 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 132.59055l-1.3847961 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 207.31236l-2.2071075 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 132.59055l-1.5118408 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 132.59055l-1.3848267 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 207.31236l-2.2070923 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 493.29135l-1.5118103 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 493.29135l-1.3847961 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 568.0131l-2.2071075 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 493.29135l-1.5118408 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 493.29135l-1.3848267 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 568.0131l-2.2070923 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 285.29922l0 112.62991" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 285.29922l0 112.62991" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m510.99274 281.8629l-293.38583 116.09448" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m510.99274 281.8629l-293.38583 116.09448" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m208.02563 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm11.195572 -5.078125q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m518.7553 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm8.336182 0l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m198.76973 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm17.976822 6.796875q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m509.4994 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm15.117432 11.875l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 312.94095l0.75590515 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 312.94095l0.75590515 81.5748" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 280.2966l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 304.19498q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm8.3359375 2.875l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm12.0390625 0l-1.46875 0l-4.40625 -8.5l-0.03125 8.5l-1.453125 0l0 -11.375l1.46875 0l4.40625 8.484375l0.03125 -8.484375l1.453125 0l0 11.375zm9.4921875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m197.58267 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m197.58267 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m209.31496 417.97375l-0.75590515 51.84253" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m209.31496 417.97375l-0.75590515 51.84253" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 388.76117l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 388.76117l70.36218 0l0 41.82675l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m554.6078 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm9.7578125 -5.328125q0 0.90625 -0.21875 1.703125q-0.21875 0.78125 -0.640625 1.359375q-0.421875 0.578125 -1.046875 0.90625q-0.625 0.328125 -1.421875 0.328125q-0.8125 0 -1.421875 -0.28125q-0.59375 -0.296875 -1.015625 -0.84375l-0.0625 0.96875l-1.328125 0l0 -12.0l1.4375 0l0 4.453125q0.421875 -0.515625 1.0 -0.78125q0.59375 -0.28125 1.375 -0.28125q0.8125 0 1.4375 0.328125q0.625 0.3125 1.046875 0.890625q0.421875 0.5625 0.640625 1.359375q0.21875 0.78125 0.21875 1.734375l0 0.15625zm-1.453125 -0.15625q0 -0.625 -0.125 -1.171875q-0.109375 -0.5625 -0.375 -0.984375q-0.265625 -0.4375 -0.703125 -0.6875q-0.421875 -0.25 -1.046875 -0.25q-0.375 0 -0.6875 0.109375q-0.3125 0.09375 -0.5625 0.265625q-0.25 0.171875 -0.4375 0.421875q-0.1875 0.234375 -0.328125 0.515625l0 3.6875q0.140625 0.28125 0.328125 0.53125q0.203125 0.234375 0.453125 0.421875q0.25 0.171875 0.5625 0.265625q0.3125 0.09375 0.6875 0.09375q0.59375 0 1.015625 -0.234375q0.421875 -0.25 0.6875 -0.671875q0.28125 -0.421875 0.40625 -0.96875q0.125 -0.5625 0.125 -1.1875l0 -0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 273.56693l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 273.56693l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 237.62993l0 24.220474" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 237.62993l0 24.220474" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 252.65355l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m558.89294 276.47382l-3.796875 0l-0.921875 2.953125l-1.4375 0l3.671875 -11.375l1.203125 0l3.609375 11.375l-1.4375 0l-0.890625 -2.953125zm-3.40625 -1.25l3.015625 0l-1.5 -4.9375l-1.515625 4.9375zm13.5234375 1.328125q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm10.6640625 4.0625l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/></g></svg>
\ No newline at end of file
diff --git a/doc/rm/crossbar_example_5.svg b/doc/rm/crossbar_example_5.svg
new file mode 100644
index 0000000..f5e469c
--- /dev/null
+++ b/doc/rm/crossbar_example_5.svg
@@ -0,0 +1 @@
+<svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path stroke="#b7b7b7" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="4.0,3.0" d="m128.49869 156.03412l493.5748 0l0 382.42517l-493.5748 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 225.89764l0 0c0 -6.4795685 5.2527313 -11.732285 11.732285 -11.732285l0 0c3.1116028 0 6.095749 1.2360687 8.295975 3.4362946c2.200241 2.200241 3.4363098 5.184387 3.4363098 8.29599l0 0c0 6.479553 -5.252716 11.732285 -11.732285 11.732285l0 0c-6.479553 0 -11.732285 -5.2527313 -11.732285 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 132.59055l-1.5118103 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 132.59055l-1.3847961 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 207.31236l-2.2071075 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 225.89764l0 0c0 -6.4795685 5.252716 -11.732285 11.732269 -11.732285l0 0c3.1116333 0 6.095764 1.2360687 8.2960205 3.4362946c2.2001953 2.200241 3.4362793 5.184387 3.4362793 8.29599l0 0c0 6.479553 -5.2527466 11.732285 -11.7323 11.732285l0 0c-6.479553 0 -11.732269 -5.2527313 -11.732269 -11.732285z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 132.59055l-1.5118408 81.574814" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 132.59055l-1.3848267 74.72182" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 207.31236l-2.2070923 -2.2904663l2.1342773 6.220154l2.3632812 -6.136795z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 481.55905l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.2360535 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.1843567 3.4363098 8.295959l0 0c0 6.479553 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.2527466 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 481.55905l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m210.07086 493.29135l-1.5118103 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m210.07086 493.29135l-1.3847961 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m208.68607 568.0131l-2.2071075 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m520.80054 493.29135l-1.5118408 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m520.80054 493.29135l-1.3848267 74.72183" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="2.0" stroke-linecap="butt" d="m519.4157 568.0131l-2.2070923 -2.2904053l2.1342773 6.220093l2.3632812 -6.13678z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 237.62993l0 51.842514" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 332.9685l0 64.97638" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 332.9685l0 64.97638" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m216.85503 309.50464l294.14172 91.87402" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m510.99274 329.5322l-293.38583 68.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m510.99274 329.5322l-293.38583 68.409454" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m174.13387 90.76378l70.3622 0l0 41.826767l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m208.02563 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm11.195572 -5.078125q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.86353 90.76378l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m518.7553 118.59716l-1.59375 0l0 -6.125l-5.4375 0l0 6.125l-1.59375 0l0 -13.265625l1.59375 0l0 5.703125l5.4375 0l0 -5.703125l1.59375 0l0 13.265625zm8.336182 0l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m173.37796 574.853l70.3622 0l0 41.826782l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m198.76973 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm17.976822 6.796875q0 1.265625 -0.296875 2.25q-0.28125 0.984375 -0.828125 1.65625q-0.546875 0.65625 -1.34375 1.015625q-0.78125 0.34375 -1.8125 0.34375q-1.0 0 -1.796875 -0.34375q-0.796875 -0.359375 -1.359375 -1.015625q-0.5625 -0.671875 -0.859375 -1.65625q-0.28125 -0.984375 -0.28125 -2.25l0 -3.109375q0 -1.265625 0.28125 -2.234375q0.296875 -0.984375 0.84375 -1.65625q0.546875 -0.671875 1.34375 -1.015625q0.796875 -0.359375 1.8125 -0.359375q1.015625 0 1.8125 0.359375q0.796875 0.34375 1.34375 1.015625q0.5625 0.671875 0.84375 1.65625q0.296875 0.96875 0.296875 2.234375l0 3.109375zm-6.890625 -0.328125l5.171875 -3.96875q-0.15625 -1.3125 -0.78125 -2.0q-0.625 -0.6875 -1.796875 -0.6875q-1.328125 0 -1.96875 0.890625q-0.625 0.890625 -0.625 2.625l0 3.140625zm5.203125 -2.359375l-5.15625 3.953125q0.15625 1.28125 0.78125 1.953125q0.640625 0.671875 1.78125 0.671875q1.34375 0 1.96875 -0.90625q0.625 -0.90625 0.625 -2.625l0 -3.046875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m484.1076 574.853l70.36218 0l0 41.826782l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m509.4994 602.6864l0 -13.265625l3.078125 0q1.375 0.015625 2.46875 0.46875q1.09375 0.453125 1.84375 1.265625q0.75 0.796875 1.140625 1.921875q0.40625 1.125 0.40625 2.5l0 0.96875q0 1.375 -0.40625 2.5q-0.390625 1.125 -1.140625 1.9375q-0.75 0.796875 -1.84375 1.25q-1.09375 0.4375 -2.46875 0.453125l-3.078125 0zm1.71875 -11.875l0 10.5l1.359375 0q1.078125 -0.015625 1.859375 -0.375q0.78125 -0.375 1.296875 -1.0q0.515625 -0.640625 0.765625 -1.5q0.25 -0.875 0.25 -1.890625l0 -0.984375q0 -1.015625 -0.265625 -1.875q-0.25 -0.859375 -0.765625 -1.484375q-0.5 -0.640625 -1.28125 -1.0q-0.78125 -0.375 -1.859375 -0.390625l-1.359375 0zm15.117432 11.875l-1.6875 0l0 -11.109375l-3.46875 1.3125l0 -1.53125l5.03125 -1.9375l0.125 0l0 13.265625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m196.82677 301.20865l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m208.55905 312.94095l0.75590515 81.5748" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m208.55905 312.94095l0.75590515 81.5748" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 280.2966l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 304.19498q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm8.3359375 2.875l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm12.0390625 0l-1.46875 0l-4.40625 -8.5l-0.03125 8.5l-1.453125 0l0 -11.375l1.46875 0l4.40625 8.484375l0.03125 -8.484375l1.453125 0l0 11.375zm9.4921875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m197.58267 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m197.58267 406.24146l0 0c0 -6.479553 5.2527313 -11.732269 11.732285 -11.732269l0 0c3.1116028 0 6.095749 1.236084 8.295975 3.4363098c2.200241 2.2002258 3.4363098 5.184387 3.4363098 8.295959l0 0c0 6.4795837 -5.252716 11.7323 -11.732285 11.7323l0 0c-6.479553 0 -11.732285 -5.252716 -11.732285 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m209.31496 417.97375l-0.75590515 51.84253" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m209.31496 417.97375l-0.75590515 51.84253" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 409.67453l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 421.40683l0 48.409454" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m126.46457 388.76117l70.3622 0l0 41.82675l-70.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m144.95427 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 388.76117l70.36218 0l0 41.82675l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m554.6078 412.65955q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm5.2421875 -8.5l1.84375 5.6875l2.0 -5.6875l1.796875 0l0 11.375l-1.40625 0l0 -4.546875l0.125 -4.75l-2.109375 6.125l-0.828125 0l-1.921875 -5.953125l0.109375 4.578125l0 4.546875l-1.40625 0l0 -11.375l1.796875 0zm12.6953125 11.375l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm11.9296875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm9.7578125 -5.328125q0 0.90625 -0.21875 1.703125q-0.21875 0.78125 -0.640625 1.359375q-0.421875 0.578125 -1.046875 0.90625q-0.625 0.328125 -1.421875 0.328125q-0.8125 0 -1.421875 -0.28125q-0.59375 -0.296875 -1.015625 -0.84375l-0.0625 0.96875l-1.328125 0l0 -12.0l1.4375 0l0 4.453125q0.421875 -0.515625 1.0 -0.78125q0.59375 -0.28125 1.375 -0.28125q0.8125 0 1.4375 0.328125q0.625 0.3125 1.046875 0.890625q0.421875 0.5625 0.640625 1.359375q0.21875 0.78125 0.21875 1.734375l0 0.15625zm-1.453125 -0.15625q0 -0.625 -0.125 -1.171875q-0.109375 -0.5625 -0.375 -0.984375q-0.265625 -0.4375 -0.703125 -0.6875q-0.421875 -0.25 -1.046875 -0.25q-0.375 0 -0.6875 0.109375q-0.3125 0.09375 -0.5625 0.265625q-0.25 0.171875 -0.4375 0.421875q-0.1875 0.234375 -0.328125 0.515625l0 3.6875q0.140625 0.28125 0.328125 0.53125q0.203125 0.234375 0.453125 0.421875q0.25 0.171875 0.5625 0.265625q0.3125 0.09375 0.6875 0.09375q0.59375 0 1.015625 -0.234375q0.421875 -0.25 0.6875 -0.671875q0.28125 -0.421875 0.40625 -0.96875q0.125 -0.5625 0.125 -1.1875l0 -0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 273.56693l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 273.56693l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.2360535 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.1843567 3.4362793 8.295959l0 0c0 6.479553 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.2527466 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 237.62993l0 24.220474" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 237.62993l0 24.220474" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 252.65355l70.36218 0l0 41.826767l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m558.89294 276.47382l-3.796875 0l-0.921875 2.953125l-1.4375 0l3.671875 -11.375l1.203125 0l3.609375 11.375l-1.4375 0l-0.890625 -2.953125zm-3.40625 -1.25l3.015625 0l-1.5 -4.9375l-1.515625 4.9375zm13.5234375 1.328125q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm10.6640625 4.0625l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm8.1484375 -1.1875q-0.09375 -0.171875 -0.140625 -0.40625q-0.046875 -0.25 -0.078125 -0.515625q-0.21875 0.21875 -0.484375 0.421875q-0.265625 0.1875 -0.59375 0.34375q-0.328125 0.140625 -0.703125 0.21875q-0.359375 0.09375 -0.765625 0.09375q-0.671875 0 -1.21875 -0.1875q-0.546875 -0.203125 -0.921875 -0.53125q-0.375 -0.34375 -0.59375 -0.796875q-0.203125 -0.453125 -0.203125 -0.984375q0 -0.703125 0.28125 -1.21875q0.28125 -0.53125 0.78125 -0.875q0.515625 -0.34375 1.21875 -0.515625q0.71875 -0.171875 1.609375 -0.171875l1.578125 0l0 -0.671875q0 -0.375 -0.140625 -0.671875q-0.140625 -0.3125 -0.40625 -0.53125q-0.25 -0.21875 -0.625 -0.328125q-0.375 -0.125 -0.828125 -0.125q-0.4375 0 -0.78125 0.109375q-0.328125 0.109375 -0.5625 0.296875q-0.234375 0.171875 -0.375 0.421875q-0.125 0.25 -0.125 0.515625l-1.453125 0q0.015625 -0.46875 0.234375 -0.90625q0.234375 -0.453125 0.671875 -0.796875q0.4375 -0.359375 1.046875 -0.578125q0.625 -0.21875 1.421875 -0.21875q0.71875 0 1.328125 0.171875q0.625 0.171875 1.0625 0.53125q0.453125 0.359375 0.703125 0.890625q0.265625 0.53125 0.265625 1.234375l0 3.9375q0 0.421875 0.078125 0.890625q0.078125 0.46875 0.21875 0.828125l0 0.125l-1.5 0zm-2.5625 -1.109375q0.421875 0 0.78125 -0.109375q0.375 -0.109375 0.671875 -0.28125q0.3125 -0.1875 0.53125 -0.40625q0.21875 -0.234375 0.34375 -0.484375l0 -1.71875l-1.34375 0q-1.265625 0 -1.96875 0.375q-0.703125 0.375 -0.703125 1.1875q0 0.3125 0.09375 0.578125q0.109375 0.265625 0.3125 0.453125q0.21875 0.1875 0.53125 0.296875q0.328125 0.109375 0.75 0.109375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m507.55643 321.2362l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m507.55643 321.2362l0 0c0 -6.479553 5.252716 -11.732269 11.732269 -11.732269l0 0c3.1116333 0 6.095764 1.236084 8.2960205 3.4363098c2.2001953 2.2002258 3.4362793 5.184387 3.4362793 8.295959l0 0c0 6.4795837 -5.2527466 11.7323 -11.7323 11.7323l0 0c-6.479553 0 -11.732269 -5.252716 -11.732269 -11.7323z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m536.1181 300.32285l70.36218 0l0 41.82675l-70.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m554.6078 324.22122q0 -0.53125 -0.234375 -0.890625q-0.234375 -0.359375 -0.609375 -0.59375q-0.375 -0.25 -0.828125 -0.40625q-0.453125 -0.171875 -0.859375 -0.3125q-0.609375 -0.1875 -1.234375 -0.453125q-0.609375 -0.28125 -1.125 -0.671875q-0.515625 -0.40625 -0.84375 -0.953125q-0.3125 -0.546875 -0.3125 -1.28125q0 -0.734375 0.3125 -1.3125q0.328125 -0.578125 0.84375 -0.96875q0.53125 -0.40625 1.1875 -0.609375q0.671875 -0.203125 1.34375 -0.203125q0.75 0 1.4375 0.25q0.6875 0.234375 1.21875 0.6875q0.53125 0.4375 0.84375 1.078125q0.328125 0.625 0.34375 1.40625l-1.484375 0q-0.0625 -0.484375 -0.25 -0.890625q-0.171875 -0.40625 -0.46875 -0.6875q-0.296875 -0.296875 -0.71875 -0.453125q-0.40625 -0.15625 -0.921875 -0.15625q-0.40625 0 -0.8125 0.125q-0.390625 0.109375 -0.703125 0.34375q-0.296875 0.234375 -0.484375 0.578125q-0.1875 0.34375 -0.1875 0.796875q0.015625 0.484375 0.25 0.828125q0.25 0.34375 0.609375 0.578125q0.375 0.234375 0.8125 0.390625q0.4375 0.15625 0.8125 0.265625q0.421875 0.140625 0.84375 0.3125q0.4375 0.15625 0.828125 0.375q0.40625 0.21875 0.75 0.5q0.34375 0.265625 0.59375 0.625q0.265625 0.34375 0.40625 0.765625q0.15625 0.40625 0.15625 0.921875q0 0.765625 -0.34375 1.34375q-0.34375 0.5625 -0.890625 0.9375q-0.53125 0.375 -1.21875 0.578125q-0.671875 0.1875 -1.34375 0.1875q-0.765625 0 -1.5 -0.234375q-0.71875 -0.234375 -1.296875 -0.671875q-0.5625 -0.453125 -0.921875 -1.078125q-0.359375 -0.640625 -0.390625 -1.453125l1.484375 0q0.0625 0.53125 0.28125 0.9375q0.21875 0.40625 0.5625 0.703125q0.34375 0.28125 0.796875 0.421875q0.453125 0.140625 0.984375 0.140625q0.421875 0 0.828125 -0.09375q0.40625 -0.109375 0.71875 -0.328125q0.328125 -0.234375 0.53125 -0.5625q0.203125 -0.34375 0.203125 -0.8125zm8.3359375 2.875l-1.4375 0l0 -9.53125l-2.984375 1.125l0 -1.3125l4.3125 -1.65625l0.109375 0l0 11.375zm12.0390625 0l-1.46875 0l-4.40625 -8.5l-0.03125 8.5l-1.453125 0l0 -11.375l1.46875 0l4.40625 8.484375l0.03125 -8.484375l1.453125 0l0 11.375zm9.4921875 1.1875l-7.15625 0l0 -1.1875l7.15625 0l0 1.1875zm9.7578125 -5.328125q0 0.90625 -0.21875 1.703125q-0.21875 0.78125 -0.640625 1.359375q-0.421875 0.578125 -1.046875 0.90625q-0.625 0.328125 -1.421875 0.328125q-0.8125 0 -1.421875 -0.28125q-0.59375 -0.296875 -1.015625 -0.84375l-0.0625 0.96875l-1.328125 0l0 -12.0l1.4375 0l0 4.453125q0.421875 -0.515625 1.0 -0.78125q0.59375 -0.28125 1.375 -0.28125q0.8125 0 1.4375 0.328125q0.625 0.3125 1.046875 0.890625q0.421875 0.5625 0.640625 1.359375q0.21875 0.78125 0.21875 1.734375l0 0.15625zm-1.453125 -0.15625q0 -0.625 -0.125 -1.171875q-0.109375 -0.5625 -0.375 -0.984375q-0.265625 -0.4375 -0.703125 -0.6875q-0.421875 -0.25 -1.046875 -0.25q-0.375 0 -0.6875 0.109375q-0.3125 0.09375 -0.5625 0.265625q-0.25 0.171875 -0.4375 0.421875q-0.1875 0.234375 -0.328125 0.515625l0 3.6875q0.140625 0.28125 0.328125 0.53125q0.203125 0.234375 0.453125 0.421875q0.25 0.171875 0.5625 0.265625q0.3125 0.09375 0.6875 0.09375q0.59375 0 1.015625 -0.234375q0.421875 -0.25 0.6875 -0.671875q0.28125 -0.421875 0.40625 -0.96875q0.125 -0.5625 0.125 -1.1875l0 -0.15625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m519.2887 285.29922l0 24.220459" fill-rule="evenodd"/><path stroke="#000000" stroke-width="2.0" stroke-linejoin="round" stroke-linecap="butt" d="m519.2887 285.29922l0 24.220459" fill-rule="evenodd"/></g></svg>
\ No newline at end of file
diff --git a/doc/rm/crossbar_tool.md b/doc/rm/crossbar_tool.md
new file mode 100644
index 0000000..f206a40
--- /dev/null
+++ b/doc/rm/crossbar_tool.md
@@ -0,0 +1,166 @@
+{{% lowrisc-doc-hdr Crossbar Generation Tool }}
+
+The crossbar tool `tlgen.py` is used to build the TL-UL crossbar RTL. It is used
+standalone or invoked as part of top module generation process.
+`hw/top_earlgrey/ip/xbar/rtl/autogen/*.sv` RTLs are generated with the crossbar
+tool. This document doesn't explain its internal blocks. [Bus
+Specification](../../hw/ip/tlul/doc/tlul.md) explains the protocol and the
+components used in the crossbar.
+
+{{% toc 3 }}
+
+## Standalone tlgen.py
+
+The standalone `tlgen.py` is a python3 script to read crossbar Hjson
+configuration file and generate crossbar package, crossbar RTL, and the simple
+DV test for checking the connectivity.
+
+The `--help` flag is supported to print the usage.
+
+### Example and Results
+
+The example of the crossbar Hjson is given in
+`util/example/tlgen/xbar_main.hjson`.
+
+The package file and RTL can be created by the command below:
+
+```console
+ $ util/tlgen.py -t util/example/tlgen/xbar_main.hjson -o /tmp/
+```
+
+It creates the files in `/tmp/{rtl|dv}`. While generating the RTL, the tool
+creates the connection information into the header of the RTL.
+
+## Configuration File Format
+
+The `tlgen` reads an Hjson file containing the crossbar connections and the
+hosts and devices information. It is the description of generic Directed Acyclic
+Graph (DAG) with some additional clock information and steering information.
+
+If the tool is used in the process of top generation (`topgen.py`), a few fields
+are derived from the top Hjson configuration module structure.
+
+A description of Hjson and the recommended style is in the [Hjson Usage and
+Style Guide](hjson_usage_style.md).
+
+The tables below describe the keys for each context. The tool raises an error if
+*Required* keys are missing. *Optional* keys may be provided in the input files.
+The tool also may insert the optional keys with default value.
+
+{{% include !../../util/tlgen.py --doc }}
+
+## Fabrication process
+
+The tool fabricates a sparse crossbar from the given Hjson configuration file.
+At first, the tool creates Vertex(Node) and Edge. Then it creates internal
+building blocks such as Asynchronous FIFO, Socket 1:N, or Socket M:1 at the
+elaboration stage. Please refer to `util/tlgen/elaborate.py` for the details.
+
+### Traversing DAG
+
+The tool, after building Nodes and Edges, traverses downstream from every Host
+nodes towards downstream during elaboration. In the process of traversal, it adds
+internal blocks if necessary. If all Nodes are visited, the tool completes
+traversing then moves to RTL generation stage.
+
+1. Generates Nodes and Edges from the Hjson. Start node should be Host and end
+ node should be Device.
+2. (for loop) Visit every hosts
+3. If a node has different clock from main clock and not Async FIFO,
+ 1. (New Node) Create Async FIFO Node.
+ 2. If the Node is host, revise every edges from the node to have start node
+ in Async FIFO. (New Edge) Create an Edge from the Node to Async FIFO. Then go to Step 3
+ with Async FIFO Node. Eventually, the connection is changed to `host ->
+ async_fifo -> downstreams` from `host -> downstreams`.
+ 3. Revise every Edge to the Node to have Async FIFO as a downstream port.
+ (New Edge) Create an Edge from the Async FIFO to the Node.
+ 4. If it is not the Device, raise Error. If it is, repeat from Step 2 with
+ next item.
+4. If a Node has multiple Edges pointing it as a downstream port, `nodes -> this
+ node` and not Socket M:1,
+ 1. (New Node) Create Socket M:1.
+ 2. Revise every Edge to the Node to point Socket M:1 as a downstream port
+ 3. (New Edge) Create an Edge from Socket M:1 to the Node.
+ The new connections look like `nodes -> socket_m1 -> this node`.
+ 4. Repeat from Step 3 with the Node.
+5. If a Node has multiple Edges and not Socket 1:N,
+ 1. (New Node) Create Socket 1:N Node.
+ 2. Revise every Edge from the Node to point to Socket 1:N as an upstream port
+ 3. (New Edge) Create an Edge from the Node to Socket 1:N.
+ 4. (for loop) Repeat from Step 3 with Socket 1:N's downstream Nodes.
+
+Below shows the example of 2 Hosts and 2 Devices connection
+
+
+
+Each circle represents a Node and an arrow represents an Edge that has downward
+direction. The tool starts from `H0` Node. As the Node has two downstream Edges
+and not Socket 1:N, the tool creates Socket 1:N based on the condition #5 above.
+Then repeat the process from Socket 1:N Node's children Nodes, `D0` and `D1`.
+
+
+
+For `D0`, the tool creates Socket M:1 based on the condition #4. Then visit its
+downstream Node, `D0` again. In this case, it doesn't create Async FIFO as the
+clock is same as main clock. So it reached the terminal Node. Then visit `D1`.
+It repeats the same step (condition #4) as `D0`, which creates another Socket
+M:1.
+
+
+
+As all Nodes from `H0` have been visited, the tool repeats all steps from `H1`.
+It applies condition #3 above as `H1` has peripheral clock rather than main
+clock. So the tool creates an Asynch FIFO and moves the pointer to the Node and
+repeats.
+
+
+
+It applies #5 as Async FIFO has multiple downstream Nodes(Edges) and it is not
+Socket 1:N. The tool creates a Socket 1:N and visit every downstream Nodes.
+
+
+
+Both Nodes are processed. So no condition is hit. The tool completes traversing.
+
+### Numbering
+
+After the traversing is completed, Hosts and Devices only have one Edge and
+internal Sockets have multiple Edges. The tool assigns increasing numbers into
+each Edge starting from 0. This helps the tool to connect between Nodes.
+
+### Propagating the steering information (Address)
+
+After the numbering is done, the tool propagates the steering information,
+address from every Device Nodes to the upstream until it hits Socket 1:N. Socket
+1:N is the only module that utilizes the `base_addr` and `size_bytes`.
+
+It is assumed that at most only one Socket 1:N exists on the path from a Host to
+a Device within a crossbar. If any SoC requires multi-tiered crossbar design, it
+should have more than one crossbar communicate each other.
+
+### Connection information
+
+The tool creates DAG connections when it creates RTL to help understanding the
+fabric. The information is put in the header of the RTL. For instance, above 2x2
+example has the information below.
+
+```
+ $ util/tlgen.py -t util/example/tlgen/xbar_2x2.hjson -o /tmp/
+ $ cat /tmp/rtl/xbar_2x2.sv
+// ...
+// Interconnect
+// h0
+// -> s1n_4
+// -> sm1_5
+// -> d0
+// -> sm1_6
+// -> d1
+// h1
+// -> asf_7
+// -> s1n_8
+// -> sm1_5
+// -> d0
+// -> sm1_6
+// -> d1
+// ...
+```
diff --git a/doc/rm/index.md b/doc/rm/index.md
index cabd236..47a08f0 100644
--- a/doc/rm/index.md
+++ b/doc/rm/index.md
@@ -2,8 +2,9 @@
* [Comportability Definition and Specification](comportability_specification.md)
* Tool Guides
- * [Register Tool](register_tool.md): Describes `regtool.py` and its HJSON format source. Used to generate documentation, rtl, header files and validation files for IP Registers and toplevel.
- * [Vendor-In Tool](vendor_hw_tool.md): Describes `vendor_hw.py` and its HJSON control file. Used to pull a local copy of code maintained in other upstream repositories and apply local patch sets.
+ * [Register Tool](register_tool.md): Describes `regtool.py` and its Hjson format source. Used to generate documentation, rtl, header files and validation files for IP Registers and toplevel.
+ * [Vendor-In Tool](vendor_hw_tool.md): Describes `vendor_hw.py` and its Hjson control file. Used to pull a local copy of code maintained in other upstream repositories and apply local patch sets.
+ * [Crossbar Tool](crossbar_tool.md): Describes `tlgen.py` and its Hjson format source. Used to generate RTL and validation files for the crossbar.
* Coding Style Guides
* [Verilog Coding Style](https://github.com/lowRISC/style-guides/blob/master/VerilogCodingStyle.md)
* [Python Coding Style](python_coding_style.md)
diff --git a/util/example/tlgen/dv/device_sram.sv b/util/example/tlgen/dv/device_sram.sv
deleted file mode 100644
index 3f0037a..0000000
--- a/util/example/tlgen/dv/device_sram.sv
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-
-module device_sram (
- input clk_i,
-
- input tlul_pkg::tl_h2d_t tl_i,
- output tlul_pkg::tl_d2h_t tl_o
-);
-
- import tlul_pkg::*;
-
- logic [31:0] storage [*];
-
- initial begin
- tl_o.a_ready = 1'b1;
- tl_o.d_valid = 1'b0;
-
- forever begin
- @(posedge clk_i iff (tl_i.a_valid == 1'b1));
- tl_o.d_error = 1'b0;
- tl_o.d_source = tl_i.a_source;
- tl_o.d_size = tl_i.a_size;
- tl_o.d_sink = 0;
- tl_o.d_param = 2'h0;
- tl_o.d_user = 'h0;
- if (tl_i.a_opcode == Get) begin
- if (storage.exists(tl_i.a_address[31:2])) begin
- tl_o.d_data = storage[tl_i.a_address[31:2]];
- end else begin
- tl_o.d_data = $urandom();
- storage[tl_i.a_address[31:2]] = tl_o.d_data;
- end
-
- tl_o.a_ready = 1'b0;
- tl_o.d_opcode = AccessAckData;
- tl_o.d_valid = 1'b1;
- @(posedge clk_i iff (tl_i.d_ready == 1'b1));
- tl_o.d_valid = 1'b0;
- tl_o.a_ready = 1'b1;
- end else if (tl_i.a_opcode == PutFullData) begin
- storage[tl_i.a_address[31:2]] = tl_i.a_data;
- tl_o.a_ready = 1'b0;
- tl_o.d_opcode = AccessAck;
- tl_o.d_valid = 1'b1;
- @(posedge clk_i iff (tl_i.d_ready == 1'b1));
- tl_o.d_valid = 1'b0;
- tl_o.a_ready = 1'b1;
- end
- end
- end
-
-endmodule
diff --git a/util/example/tlgen/xbar_2x2.hjson b/util/example/tlgen/xbar_2x2.hjson
new file mode 100644
index 0000000..7d639d5
--- /dev/null
+++ b/util/example/tlgen/xbar_2x2.hjson
@@ -0,0 +1,15 @@
+{
+ name: "2x2",
+ clock: "main",
+ nodes: [
+ { name: "h0", type: "host", clock: "main" },
+ { name: "h1", type: "host", clock: "periph" },
+ { name: "d0", type: "device", clock: "main", base_addr: "0x0000", size_byte: "0x1000" },
+ { name: "d1", type: "device", clock: "main", base_addr: "0x1000", size_byte: "0x1000" }
+ ],
+ connections: {
+ h0: ["d0", "d1"],
+ h1: ["d0", "d1"]
+ }
+}
+
diff --git a/util/example/tlgen/top_jasmine.hjson b/util/example/tlgen/xbar_main.hjson
similarity index 91%
rename from util/example/tlgen/top_jasmine.hjson
rename to util/example/tlgen/xbar_main.hjson
index 64982dd..a242d7b 100644
--- a/util/example/tlgen/top_jasmine.hjson
+++ b/util/example/tlgen/xbar_main.hjson
@@ -7,14 +7,20 @@
{ name: "ibexif",
type: "host",
clock: "main",
+
+ pipeline: "false"
},
{ name: "ibexlsu",
type: "host",
clock: "periph",
+
+ pipeline: "false"
},
{ name: "dm_sba", // DM
type: "host",
clock: "jtag",
+
+ pipeline_byp: "false"
},
{ name: "rom",
type: "device",
@@ -22,7 +28,12 @@
base_addr: "0x00000000",
size_byte: "0x10000", // 64kB
},
- { name: "debug_rom", type: "device", clock: "jtag", base_addr: "0x10040000", size_byte: "0x1000" },
+ { name: "debug_rom",
+ type: "device",
+ clock: "jtag",
+ base_addr: "0x10040000",
+ size_byte: "0x1000"
+ },
{ name: "sram",
type: "device",
clock: "main",
diff --git a/util/example/xbar/rtl/xbar.sv b/util/example/xbar/rtl/xbar.sv
deleted file mode 100644
index 89e05a4..0000000
--- a/util/example/xbar/rtl/xbar.sv
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-module xbar(
- input clk,
- input rst_n,
-
- xbar_if.device xhif0,
- xbar_if.device xhif1,
- xbar_if.host xdif0,
- xbar_if.host xdif1,
- xbar_if.host xdif2
-);
-
- hdb_fifo_sync #(
- .ReqPass (1'b1),
- .RspPass (1'b1),
- .ReqDepth (2),
- .RspDepth (2)
- ) u_dut (
- .clk_i (xhif0.clk),
- .rst_ni (rst_n),
- .hdb_h_i (xhif0.host.h2d),
- .hdb_h_o (xhif0.host.d2h),
- .hdb_d_o (xdif0.device.h2d),
- .hdb_d_i (xdif0.device.d2h)
- );
- /*
- assign xdif0.req_valid = xhif0.req_valid;
- assign xdif0.req_addr = xhif0.req_addr ;
- assign xdif0.req_wr = xhif0.req_wr ;
- assign xdif0.req_wdata = xhif0.req_wdata;
- assign xdif0.req_wstrb = xhif0.req_wstrb;
- assign xdif0.req_attr = xhif0.req_attr ;
- assign xdif0.req_id = xhif0.req_id ;
- assign xhif0.req_ready = xdif0.req_ready;
-
- assign xhif0.rsp_valid = xdif0.rsp_valid;
- assign xhif0.rsp_rdata = xdif0.rsp_rdata;
- assign xhif0.rsp_attr = xdif0.rsp_attr ;
- assign xhif0.rsp_id = xdif0.rsp_id ;
- assign xdif0.rsp_ready = xhif0.rsp_ready;
- */
-
- hdb_fifo_async #(
- .ReqDepth (2),
- .RspDepth (2)
- ) u_dut_async (
- .clk_h_i (xhif1.clk),
- .rst_h_ni (rst_n),
- .clk_d_i (xdif1.clk),
- .rst_d_ni (rst_n),
-
- .hdb_h_i (xhif1.host.h2d),
- .hdb_h_o (xhif1.host.d2h),
- .hdb_d_o (xdif1.device.h2d),
- .hdb_d_i (xdif1.device.d2h)
- );
-
-endmodule
diff --git a/util/reggen/validate.py b/util/reggen/validate.py
index 384e142..89fed02 100644
--- a/util/reggen/validate.py
+++ b/util/reggen/validate.py
@@ -271,6 +271,8 @@
'lnw': ["name list+", 'name list that optionally contains a width'],
'lp': ["parameter list", 'parameter list having default value optionally'],
'g': ["group", "comma separated group of key:value enclosed in `{}`"],
+ 'lg': ["list of group", "comma separated group of key:value enclosed in `{}`"\
+ " the second entry of the list is the sub group format"],
's': ["string", "string, typically short"],
't': ["text", "string, may be multi-line enclosed in `'''` "\
"may use `**bold**`, `*italic*` or `!!Reg` markup"],
diff --git a/util/tlgen.py b/util/tlgen.py
index e1d2455..507c610 100755
--- a/util/tlgen.py
+++ b/util/tlgen.py
@@ -22,13 +22,15 @@
parser.add_argument('--topcfg',
'-t',
metavar='file',
- required=True,
type=argparse.FileType('r'),
help="`top_cfg.hjson` file.")
+ parser.add_argument('--doc',
+ '-d',
+ action='store_true',
+ help='Generate self html document in stdout')
parser.add_argument(
'--outdir',
'-o',
- required=True,
help=
"Target directory. tlgen needs 'rtl/' and 'dv/' directory under the target dir"
)
@@ -41,6 +43,15 @@
else:
log.basicConfig(format="%(levelname)s: %(message)s")
+ if args.doc:
+ # Generate Doc and return
+ sys.stdout.write(tlgen.selfdoc(heading=3, cmd='tlgen.py --doc'))
+ return
+
+ # Check if topcfg defined
+ if not args.topcfg or not args.outdir:
+ log.error("--topcfg option is mandatory to generate codes.")
+
# Check if outdir exists. If not, show error and exit
if not Path(args.outdir).is_dir():
log.error("'--outdir' should point to writable directory")
diff --git a/util/tlgen/__init__.py b/util/tlgen/__init__.py
index 7534400..50dfac7 100644
--- a/util/tlgen/__init__.py
+++ b/util/tlgen/__init__.py
@@ -7,3 +7,4 @@
from .item import Edge, Node, NodeType
from .validate import validate
from .xbar import Xbar
+from .doc import selfdoc
diff --git a/util/tlgen/doc.py b/util/tlgen/doc.py
new file mode 100644
index 0000000..1c0bf83
--- /dev/null
+++ b/util/tlgen/doc.py
@@ -0,0 +1,94 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+"""TileLink-Uncached Lightweight Xbar self document
+"""
+import logging as log
+
+from .validate import *
+
+doc_intro = """
+
+(start of output generated by `{}`)
+
+The tables describe each key and the type of the value. The following
+types are used:
+
+Type | Description
+---- | -----------
+"""
+
+doc_tail = """
+
+(end of output generated by `{}`)
+
+"""
+
+
+def print_control(control, heading):
+ """Print a control group and its subgroup recursively
+ """
+ subgroup = [] # added if the field hit sub control group
+
+ outstr = '#' * heading + ' ' + control['name'] + '\n'
+ outstr += '\n'
+
+ outstr += control['description']
+ outstr += '\n\n'
+
+ items = {**control['required'], **control['optional'], **control['added']}
+
+ if len(items) > 0:
+ outstr += """
+Field | Kind | Type | Description
+----- | ---- | ---- | ------------
+"""
+ for k, v in items.items():
+ if k in control['required']:
+ kind = "required"
+ elif k in control['optional']:
+ kind = "optional"
+ else:
+ kind = "added by tool"
+
+ v_type = val_types[v[0]][0]
+
+ if v[0] == 'lg':
+ subgroup.append(v[1])
+ log.error(val_types[v[0]])
+ outstr += '{} | {} | {} | List of {} group\n'.format(
+ k, kind, v_type, k)
+ continue
+ elif v[0] == 'g':
+ if not isinstance(v[1], str):
+ subgroup.append(v[1])
+ outstr += '{} | {} | {} | {} group\n'.format(
+ k, kind, v_type, k)
+ continue
+
+ # Generic string print
+ outstr += '{} | {} | {} | {}\n'.format(k, kind, v_type, v[1])
+
+ outstr += "\n\n"
+ # recursive subgroup
+ for e in subgroup:
+ outstr += print_control(e, heading)
+
+ return outstr
+
+
+def selfdoc(heading, cmd=""):
+ # heading : markdown header depth
+ # value type
+ outstr = doc_intro.format(cmd)
+
+ for k, v in val_types.items():
+ outstr += v[0] + " | " + v[1] + "\n"
+
+ # root + subgroup
+ outstr += print_control(root, heading)
+
+ # connections: Needs custom as the key are hosts (can vary)
+ outstr += doc_tail.format(cmd)
+
+ return outstr
diff --git a/util/tlgen/validate.py b/util/tlgen/validate.py
index e573a67..ce232f4 100644
--- a/util/tlgen/validate.py
+++ b/util/tlgen/validate.py
@@ -3,10 +3,154 @@
# SPDX-License-Identifier: Apache-2.0
import logging as log
from collections import OrderedDict
+from functools import partial
from .item import Edge, Node, NodeType
from .xbar import Xbar
+from reggen.validate import val_types, check_int, check_bool, check_ln
+
+# val_types = {
+# 'd': ["int", "integer (binary 0b, octal 0o, decimal, hex 0x)"],
+# 'x': ["xint", "x for undefined otherwise int"],
+# 'b': [
+# "bitrange", "bit number as decimal integer, \
+# or bit-range as decimal integers msb:lsb"
+# ],
+# 'l': ["list", "comma separated list enclosed in `[]`"],
+# 'ln': ["name list", 'comma separated list enclosed in `[]` of '\
+# 'one or more groups that have just name and dscr keys.'\
+# ' e.g. `{ name: "name", desc: "description"}`'],
+# 'lnw': ["name list+", 'name list that optionally contains a width'],
+# 'lp': ["parameter list", 'parameter list having default value optionally'],
+# 'g': ["group", "comma separated group of key:value enclosed in `{}`"],
+# 'lg': ["list of group", "comma separated group of key:value enclosed in `{}`"\
+# " the second entry of the list is the sub group format"],
+# 's': ["string", "string, typically short"],
+# 't': ["text", "string, may be multi-line enclosed in `'''` "\
+# "may use `**bold**`, `*italic*` or `!!Reg` markup"],
+# 'T': ["tuple", "tuple enclosed in ()"],
+# 'pi': ["python int", "Native python type int (generated)"],
+# 'pb': ["python Bool", "Native python type Bool (generated)"],
+# 'pl': ["python list", "Native python type list (generated)"],
+# 'pe': ["python enum", "Native python type enum (generated)"]
+# }
+node = {
+ 'name': 'Node configuration',
+ 'description': '''
+Crossbar node description. It can be host, device, or internal nodes.
+''',
+ 'required': {
+ 'name': ['s', 'Module instance name'],
+ 'type': ['s', 'Module type: {"host", "device", "async", "socket_1n", "socket_m1"}'],
+ },
+ 'optional': {
+ 'clock': ['s', 'main clock of the port'],
+ 'base_addr': ['d', 'Base address of the device'\
+ ' It is required for the device'],
+ 'size_byte': ['d', 'Memory space of the device'\
+ ' It is required for the device'],
+ 'pipeline': ['pb', 'If true, pipeline is added in front of the port'],
+ 'pipeline_byp': ['pb', 'Pipeline bypass. If true, '\
+ 'request/response are not latched']
+ },
+ 'added': {}
+}
+root = {
+ 'name': 'Top configuration',
+ 'description': '''
+Crossbar configuration format.
+''',
+ 'required': {
+ 'name': ['s', 'Name of the crossbar'],
+ 'clock': ['s', 'Main clock. Internal components use this clock.'\
+ ' If not specified, it is assumed to be in main clock domain'],
+ 'connections':
+ ['g', "List of edge. Key is host, entry in value list is device"],
+ 'nodes': ['lg', node]
+ },
+ 'optional': {
+ 'type': ['s', 'Indicate hjson type. "xbar" always if exist']
+ },
+ 'added': {
+ 'reset_connections': ['g', "Generated by topgen. Key is the reset signal inside IP"\
+ " and value is the top reset signal"],
+ }
+}
+
+
+def check_keys(obj, control, prefix=""):
+ """ Check the keys recursively.
+
+ The control parameter is a control group to check obj data structure.
+ """
+ error = 0
+
+ # required
+ for k, v in control["required"].items():
+ if not k in obj:
+ error += 1
+ log.error(prefix + " missing required key " + k)
+
+ # Check every fields' correctness
+ for k, v in obj.items():
+ checker = ['', '']
+ prefix_name = prefix + " " + k
+
+ if k in control["required"]:
+ checker = control["required"][k]
+ elif k in control["optional"]:
+ checker = control["optional"][k]
+ elif k in control["added"]:
+ log.warning(prefix + " contains generated key " + k)
+ checker = control["added"][k]
+ else:
+ log.warning(prefix + " contains extra key " + k)
+ continue
+
+ # Type and value check
+ if not checker[0] in val_types:
+ log.error(prefix +
+ " field {} is undefined type. Check val_types {}".format(
+ k, checker[0]))
+ if checker[0] == 'lg':
+ # List of subgroup
+ error += sum(
+ map(
+ partial(check_keys, control=checker[1],
+ prefix=prefix_name), obj[k]))
+ elif checker[0] == 'g':
+ # if second entry isn't string type, call recursively
+ if isinstance(checker[1], str):
+ log.info(
+ "Skipping {} as no further control group is given".format(
+ prefix_name))
+ continue
+
+ error += check_keys(obj=obj[k],
+ control=checker[1],
+ prefix=prefix_name)
+
+ elif checker[0] == 'd':
+ int_v, err = check_int(obj[k], prefix_name)
+ if err:
+ error += 1
+
+ elif checker[0] == 's' or checker[0] == 't':
+ # don't care the string
+ pass
+
+ elif checker[0] == 'pb':
+ b_v, err = check_bool(obj[k], prefix_name)
+ if err:
+ error += 1
+
+ else:
+ log.error(prefix_name +
+ " is not supported in this configuration format")
+
+ return error
+
def get_nodetype(t): # t: str -> NodeType
if t == "host":
@@ -44,6 +188,11 @@
addr_ranges = []
+ obj, err = validate_hjson(obj) # validate hjson format first
+ if err > 0:
+ log.error("Hjson structure error")
+ return
+
# Nodes
for nodeobj in obj["nodes"]:
clock = nodeobj["clock"].lower() if "clock" in nodeobj.keys(
@@ -78,9 +227,15 @@
node.pipeline = True if nodeobj["pipeline"].lower() in [
"true", "1"
] else False
+ else:
+ node.pipeline = False
+ if node.node_type in [NodeType.DEVICE, NodeType.HOST
+ ] and "pipeline_byp" in nodeobj:
node.pipeline_byp = True if nodeobj["pipeline_byp"].lower() in [
"true", "1"
] else False
+ else:
+ node.pipeline_byp = True
xbar.nodes.append(node)
# Edge
@@ -90,3 +245,19 @@
xbar.connect_nodes(host.lower(), device.lower())
return xbar
+
+
+def validate_hjson(obj):
+ if not "type" in obj:
+ obj["type"] = "xbar"
+ if not "name" in obj:
+ log.error("Component has no name. Aborting.")
+ return None, 1
+
+ component = obj["name"]
+ error = check_keys(obj, root, component)
+
+ if error > 0:
+ log.error("{} has top level error. Aborting".format(component))
+ return None, error
+ return obj, 0