summaryrefslogtreecommitdiff
path: root/sim/common/hw-properties.h
diff options
context:
space:
mode:
Diffstat (limited to 'sim/common/hw-properties.h')
-rw-r--r--sim/common/hw-properties.h244
1 files changed, 244 insertions, 0 deletions
diff --git a/sim/common/hw-properties.h b/sim/common/hw-properties.h
new file mode 100644
index 00000000000..511fba34daa
--- /dev/null
+++ b/sim/common/hw-properties.h
@@ -0,0 +1,244 @@
+/* This file is part of the program psim.
+
+ Copyright (C) 1994-1998, Andrew Cagney <cagney@highland.com.au>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+
+#ifndef HW_PROPERTIES_H
+#define HW_PROPERTIES_H
+
+/* The following are valid property types. The property `array' is
+ for generic untyped data. */
+
+typedef enum {
+ array_property,
+ boolean_property,
+#if 0
+ ihandle_property, /*runtime*/
+#endif
+ integer_property,
+ range_array_property,
+ reg_array_property,
+ string_property,
+ string_array_property,
+} hw_property_type;
+
+struct hw_property {
+ struct hw *owner;
+ const char *name;
+ hw_property_type type;
+ unsigned sizeof_array;
+ const void *array;
+ const struct hw_property *original;
+ object_disposition disposition;
+};
+
+#define hw_property_owner(p) ((p)->owner + 0)
+#define hw_property_name(p) ((p)->name + 0)
+#define hw_property_type(p) ((p)->type + 0)
+#define hw_property_array(p) ((p)->array + 0)
+#define hw_property_sizeof_array(p) ((p)->sizeof_array + 0)
+#define hw_property_original(p) ((p)->original + 0)
+#define hw_property_disposition(p) ((p)->disposition + 0)
+
+
+/* Find/iterate over properites attached to a device.
+
+ To iterate over all properties attached to a device, call
+ hw_find_property (.., NULL) and then hw_property_next. */
+
+const struct hw_property *hw_find_property
+(struct hw *me,
+ const char *property);
+
+const struct hw_property *hw_next_property
+(const struct hw_property *previous);
+
+
+/* Manipulate the properties belonging to a given device.
+
+ HW_ADD_* will, if the property is not already present, add a
+ property to the device. Adding a property to a device after it has
+ been created is a checked run-time error (use HW_SET_*).
+
+ HW_SET_* will always update (or create) the property so that it has
+ the specified value. Changing the type of a property is a checked
+ run-time error.
+
+ FIND returns the specified properties value. It is a checked
+ runtime error to either request a nonexistant property or to
+ request a property using the wrong type. Code locating a property
+ should first check its type (using hw_find_property above) and then
+ obtain its value using the below.
+
+ Naming convention:
+
+ void hw_add_<type>_property(struct hw *, const char *, <type>)
+ void hw_add_*_array_property(struct hw *, const char *, const <type>*, int)
+ void hw_set_*_property(struct hw *, const char *, <type>)
+ void hw_set_*_array_property(struct hw *, const char *, const <type>*, int)
+ <type> hw_find_*_property(struct hw *, const char *)
+ int hw_find_*_array_property(struct hw *, const char *, int, <type>*)
+
+ */
+
+
+void hw_add_array_property
+(struct hw *me,
+ const char *property,
+ const void *array,
+ int sizeof_array);
+
+void hw_set_array_property
+(struct hw *me,
+ const char *property,
+ const void *array,
+ int sizeof_array);
+
+const struct hw_property *hw_find_array_property
+(struct hw *me,
+ const char *property);
+
+
+
+void hw_add_boolean_property
+(struct hw *me,
+ const char *property,
+ int bool);
+
+int hw_find_boolean_property
+(struct hw *me,
+ const char *property);
+
+
+
+#if 0
+typedef struct _ihandle_runtime_property_spec {
+ const char *full_path;
+} ihandle_runtime_property_spec;
+
+void hw_add_ihandle_runtime_property
+(struct hw *me,
+ const char *property,
+ const ihandle_runtime_property_spec *ihandle);
+
+void hw_find_ihandle_runtime_property
+(struct hw *me,
+ const char *property,
+ ihandle_runtime_property_spec *ihandle);
+
+void hw_set_ihandle_property
+(struct hw *me,
+ const char *property,
+ hw_instance *ihandle);
+
+hw_instance * hw_find_ihandle_property
+(struct hw *me,
+ const char *property);
+#endif
+
+
+void hw_add_integer_property
+(struct hw *me,
+ const char *property,
+ signed_cell integer);
+
+signed_cell hw_find_integer_property
+(struct hw *me,
+ const char *property);
+
+int hw_find_integer_array_property
+(struct hw *me,
+ const char *property,
+ unsigned index,
+ signed_word *integer);
+
+
+
+typedef struct _range_property_spec {
+ hw_unit child_address;
+ hw_unit parent_address;
+ hw_unit size;
+} range_property_spec;
+
+void hw_add_range_array_property
+(struct hw *me,
+ const char *property,
+ const range_property_spec *ranges,
+ unsigned nr_ranges);
+
+int hw_find_range_array_property
+(struct hw *me,
+ const char *property,
+ unsigned index,
+ range_property_spec *range);
+
+
+
+typedef struct _reg_property_spec {
+ hw_unit address;
+ hw_unit size;
+} reg_property_spec;
+
+void hw_add_reg_array_property
+(struct hw *me,
+ const char *property,
+ const reg_property_spec *reg,
+ unsigned nr_regs);
+
+int hw_find_reg_array_property
+(struct hw *me,
+ const char *property,
+ unsigned index,
+ reg_property_spec *reg);
+
+
+
+void hw_add_string_property
+(struct hw *me,
+ const char *property,
+ const char *string);
+
+const char *hw_find_string_property
+(struct hw *me,
+ const char *property);
+
+
+
+typedef const char *string_property_spec;
+
+void hw_add_string_array_property
+(struct hw *me,
+ const char *property,
+ const string_property_spec *strings,
+ unsigned nr_strings);
+
+int hw_find_string_array_property
+(struct hw *me,
+ const char *property,
+ unsigned index,
+ string_property_spec *string);
+
+
+
+void hw_add_duplicate_property
+(struct hw *me,
+ const char *property,
+ const struct hw_property *original);
+
+#endif