[topgen] Allow named bus interfaces to connect to crossbar

The big change here is in topgen, where we teach it to cope with
wiring up named devices. To do so, incorporate each module's
bus_interfaces field into its instances and then use that field to
figure out how connections should work.

To refer to named interfaces in the crossbar file, use the syntax
"<instance>.<iface_name>" for the name of the entry in the node list
and for entries in the connections lists.

To test this, I edited OTBN's bus_interfaces list to look like this:

   bus_interfaces: [
    { protocol: "tlul", direction: "device", name: "cabbage" }
   ],

and renamed the corresponding ports in otbn.sv accordingly:

    input  tlul_pkg::tl_h2d_t cabbage_tl_i,
    output tlul_pkg::tl_d2h_t cabbage_tl_o,

The only other change needed is to the wiring in xbar_main.hjson (as
you'd expect, since the target has changed). Here we edit the list of
connections to replace "otbn" with "otbn.cabbage". Once everything is
re-generated, we get a load of signals with names involving
"otbn__cabbage" (replacing "." with "__") and everything seems to be
wired up correctly.

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
diff --git a/util/topgen.py b/util/topgen.py
index a42f6ea..9b208da 100755
--- a/util/topgen.py
+++ b/util/topgen.py
@@ -1124,7 +1124,7 @@
 
     # All IPs are generated. Connect phase now
     # Find {memory, module} <-> {xbar} connections first.
-    im.autoconnect(completecfg)
+    im.autoconnect(completecfg, name_to_block)
 
     # Generic Inter-module connection
     im.elab_intermodule(completecfg)