/* The common simulator framework for GDB, the GNU Debugger.

   Copyright 2002, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.

   Contributed by Andrew Cagney and Red Hat.

   This file is part of GDB.

   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 3 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, see <http://www.gnu.org/licenses/>.  */


#ifndef HW_BASE
#define HW_BASE

/* Create a primative device */

struct hw *hw_create
(struct sim_state *sd,
 struct hw *parent,
 const char *family,
 const char *name,
 const char *unit,
 const char *args);


/* Complete the creation of that device (finish overrides methods
   using the set_hw_* operations below) */

void hw_finish
(struct hw *me);

int hw_finished_p
(struct hw *me);


/* Delete the entire device */

void hw_delete
(struct hw *me);


/* Override device methods */

typedef void (hw_delete_callback)
     (struct hw *me);

extern void set_hw_delete(struct hw* hw, hw_delete_callback method);


/* ALLOC */

extern void create_hw_alloc_data
(struct hw *hw);
extern void delete_hw_alloc_data
(struct hw *hw);


/* PORTS */

extern void create_hw_port_data
(struct hw *hw);
extern void delete_hw_port_data
(struct hw *hw);


/* PROPERTIES */

extern void create_hw_property_data
(struct hw *hw);
extern void delete_hw_property_data
(struct hw *hw);


/* EVENTS */

extern void create_hw_event_data
(struct hw *hw);
extern void delete_hw_event_data
(struct hw *hw);


/* HANDLES */

extern void create_hw_handle_data
(struct hw *hw);
extern void delete_hw_handle_data
(struct hw *hw);


/* INSTANCES */

extern void create_hw_instance_data
(struct hw *hw);
extern void delete_hw_instance_data
(struct hw *hw);


#endif
