/*  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_cell *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
