hw_glue_finish (struct hw *me)
{
struct hw_glue *glue = HW_ZALLOC (me, struct hw_glue);
+ const char *name = hw_name (me);
/* establish our own methods */
set_hw_data (me, glue);
do_hw_attach_regs (me);
/* establish the output registers */
- {
- reg_property_spec unit;
- int reg_nr;
-
- /* find a relevant reg entry */
- reg_nr = 0;
- while (hw_find_reg_array_property (me, "reg", reg_nr, &unit)
- && !hw_unit_size_to_attach_size (hw_parent (me),
- &unit.size,
- &glue->sizeof_output,
- me))
- reg_nr++;
-
- /* check out the size */
- if (glue->sizeof_output == 0)
- hw_abort (me, "at least one reg property size must be nonzero");
- if (glue->sizeof_output % sizeof (unsigned_word) != 0)
- hw_abort (me, "reg property size must be %ld aligned",
- (long) sizeof (unsigned_word));
-
- /* and the address */
- hw_unit_address_to_attach_address (hw_parent (me),
- &unit.address,
- &glue->space,
- &glue->address,
- me);
- if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0)
- hw_abort (me, "reg property address must be %ld aligned",
- (long) (sizeof (unsigned_word) * max_nr_ports));
-
- glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word);
- glue->output = hw_zalloc (me, glue->sizeof_output);
- }
+ if (hw_find_property (me, "reg"))
+ {
+ reg_property_spec unit;
+ int reg_nr;
+
+ /* Find a relevant reg entry. */
+ reg_nr = 0;
+ while (hw_find_reg_array_property (me, "reg", reg_nr, &unit)
+ && !hw_unit_size_to_attach_size (hw_parent (me),
+ &unit.size,
+ &glue->sizeof_output,
+ me))
+ reg_nr++;
+
+ /* Check out the size ... */
+ if (glue->sizeof_output == 0)
+ hw_abort (me, "at least one reg property size must be nonzero");
+ if (glue->sizeof_output % sizeof (unsigned_word) != 0)
+ hw_abort (me, "reg property size must be %ld aligned",
+ (long) sizeof (unsigned_word));
+
+ /* ... and the address. */
+ hw_unit_address_to_attach_address (hw_parent (me),
+ &unit.address,
+ &glue->space,
+ &glue->address,
+ me);
+ if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0)
+ hw_abort (me, "reg property address must be %ld aligned",
+ (long) (sizeof (unsigned_word) * max_nr_ports));
+
+ glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word);
+ }
+ else
+ {
+ /* Allow bitwise glue devices to declare only ports. */
+ if (!strcmp (name, "glue"))
+ hw_abort (me, "Missing \"reg\" property");
+
+ glue->nr_outputs = 1;
+ glue->sizeof_output = sizeof (unsigned_word);
+ }
+ glue->output = hw_zalloc (me, glue->sizeof_output);
/* establish the input ports */
{
}
/* determine our type */
- {
- const char *name = hw_name(me);
-
- if (strcmp (name, "glue") == 0)
- glue->type = glue_io;
- else if (strcmp (name, "glue-and") == 0)
- glue->type = glue_and;
- else if (strcmp (name, "glue-or") == 0)
- glue->type = glue_or;
- else if (strcmp (name, "glue-xor") == 0)
- glue->type = glue_xor;
- else
- hw_abort (me, "unimplemented glue type");
- }
+ if (strcmp (name, "glue") == 0)
+ glue->type = glue_io;
+ else if (strcmp (name, "glue-and") == 0)
+ glue->type = glue_and;
+ else if (strcmp (name, "glue-or") == 0)
+ glue->type = glue_or;
+ else if (strcmp (name, "glue-xor") == 0)
+ glue->type = glue_xor;
+ else
+ hw_abort (me, "unimplemented glue type");
HW_TRACE ((me, "int-number %d, nr_inputs %d, nr_outputs %d",
glue->int_number, glue->nr_inputs, glue->nr_outputs));