OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [sim/] [common/] [hw-handles.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/*  This file is part of the program psim.
2
 
3
    Copyright (C) 1994-1995,1997-1998, Andrew Cagney <cagney@highland.com.au>
4
 
5
    This program is free software; you can redistribute it and/or modify
6
    it under the terms of the GNU General Public License as published by
7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
15
    You should have received a copy of the GNU General Public License
16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 
19
    */
20
 
21
 
22
#include "hw-main.h"
23
#include "hw-base.h"
24
 
25
 
26
struct hw_handle_mapping {
27
  cell_word external;
28
  struct hw *phandle;
29
  struct hw_instance *ihandle;
30
  struct hw_handle_mapping *next;
31
};
32
 
33
 
34
struct hw_handle_data {
35
  int nr_mappings;
36
  struct hw_handle_mapping *mappings;
37
};
38
 
39
void
40
create_hw_handle_data (struct hw *hw)
41
{
42
  if (hw_parent (hw) == NULL)
43
    {
44
      hw->handles_of_hw = HW_ZALLOC (hw, struct hw_handle_data);
45
    }
46
  else
47
    {
48
      hw->handles_of_hw = hw_root (hw)->handles_of_hw;
49
    }
50
}
51
 
52
void
53
delete_hw_handle_data (struct hw *hw)
54
{
55
  /* NULL */
56
}
57
 
58
 
59
 
60
#if 0
61
void
62
hw_handle_init (struct hw *hw)
63
{
64
  struct hw_handle_mapping *current_map = db->mappings;
65
  if (current_map != NULL)
66
    {
67
      db->nr_mappings = db->mappings->external;
68
      /* verify that the mappings that were not removed are in
69
         sequence down to nr 1 */
70
      while (current_map->next != NULL)
71
        {
72
          if (current_map->external != current_map->next->external + 1)
73
            error ("hw_handle: hw_handle database possibly corrupt");
74
          current_map = current_map->next;
75
        }
76
      ASSERT (current_map->next == NULL);
77
      if (current_map->external != 1)
78
        error ("hw_handle: hw_handle database possibly corrupt");
79
    }
80
  else
81
    {
82
      db->nr_mappings = 0;
83
    }
84
}
85
#endif
86
 
87
 
88
struct hw_instance *
89
hw_handle_ihandle2 (struct hw *hw,
90
                    cell_word external)
91
{
92
  struct hw_handle_data *db = hw->handles_of_hw;
93
  struct hw_handle_mapping *current_map = db->mappings;
94
  while (current_map != NULL)
95
    {
96
      if (current_map->external == external)
97
        return current_map->ihandle;
98
      current_map = current_map->next;
99
    }
100
  return (void*)0;
101
}
102
 
103
 
104
struct hw *
105
hw_handle_phandle2 (struct hw *hw,
106
                    cell_word external)
107
{
108
  struct hw_handle_data *db = hw->handles_of_hw;
109
  struct hw_handle_mapping *current_map = db->mappings;
110
  while (current_map != NULL)
111
    {
112
      if (current_map->external == external)
113
        return current_map->phandle;
114
      current_map = current_map->next;
115
    }
116
  return (void*)0;
117
}
118
 
119
 
120
cell_word
121
hw_handle_2ihandle (struct hw *hw,
122
                    struct hw_instance *internal)
123
{
124
  struct hw_handle_data *db = hw->handles_of_hw;
125
  struct hw_handle_mapping *current_map = db->mappings;
126
  while (current_map != NULL)
127
    {
128
      if (current_map->ihandle == internal)
129
        return current_map->external;
130
      current_map = current_map->next;
131
    }
132
  return 0;
133
}
134
 
135
 
136
cell_word
137
hw_handle_2phandle (struct hw *hw,
138
                    struct hw *internal)
139
{
140
  struct hw_handle_data *db = hw->handles_of_hw;
141
  struct hw_handle_mapping *current_map = db->mappings;
142
  while (current_map != NULL)
143
    {
144
      if (current_map->phandle == internal)
145
        return current_map->external;
146
      current_map = current_map->next;
147
    }
148
  return 0;
149
}
150
 
151
 
152
void
153
hw_handle_add_ihandle (struct hw *hw,
154
                       struct hw_instance *internal)
155
{
156
  struct hw_handle_data *db = hw->handles_of_hw;
157
  if (hw_handle_2ihandle (hw, internal) != 0)
158
    {
159
      hw_abort (hw, "attempting to add an ihandle already in the data base");
160
    }
161
  else
162
    {
163
      /* insert at the front making things in decending order */
164
      struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
165
      new_map->next = db->mappings;
166
      new_map->ihandle = internal;
167
      db->nr_mappings += 1;
168
      new_map->external = db->nr_mappings;
169
      db->mappings = new_map;
170
    }
171
}
172
 
173
 
174
void
175
hw_handle_add_phandle (struct hw *hw,
176
                       struct hw *internal)
177
{
178
  struct hw_handle_data *db = hw->handles_of_hw;
179
  if (hw_handle_2phandle (hw, internal) != 0)
180
    {
181
      hw_abort (hw, "attempting to add a phandle already in the data base");
182
    }
183
  else
184
    {
185
      /* insert at the front making things in decending order */
186
      struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
187
      new_map->next = db->mappings;
188
      new_map->phandle = internal;
189
      db->nr_mappings += 1;
190
      new_map->external = db->nr_mappings;
191
      db->mappings = new_map;
192
    }
193
}
194
 
195
 
196
void
197
hw_handle_remove_ihandle (struct hw *hw,
198
                          struct hw_instance *internal)
199
{
200
  struct hw_handle_data *db = hw->handles_of_hw;
201
  struct hw_handle_mapping **current_map = &db->mappings;
202
  while (*current_map != NULL)
203
    {
204
      if ((*current_map)->ihandle == internal)
205
        {
206
          struct hw_handle_mapping *delete = *current_map;
207
          *current_map = delete->next;
208
          zfree (delete);
209
          return;
210
        }
211
      current_map = &(*current_map)->next;
212
    }
213
  hw_abort (hw, "attempt to remove nonexistant ihandle");
214
}
215
 
216
 
217
void
218
hw_handle_remove_phandle (struct hw *hw,
219
                          struct hw *internal)
220
{
221
  struct hw_handle_data *db = hw->handles_of_hw;
222
  struct hw_handle_mapping **current_map = &db->mappings;
223
  while (*current_map != NULL)
224
    {
225
      if ((*current_map)->phandle == internal)
226
        {
227
          struct hw_handle_mapping *delete = *current_map;
228
          *current_map = delete->next;
229
          zfree (delete);
230
          return;
231
        }
232
      current_map = &(*current_map)->next;
233
    }
234
  hw_abort (hw, "attempt to remove nonexistant phandle");
235
}
236
 
237
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.