00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef RU_MANAGER_H
00023 #define RU_MANAGER_H
00024
00025 #include <stdio.h>
00026 #include <malloc.h>
00027 #include <stdarg.h>
00028
00029 #include "lmdes.h"
00030 #include "sm_mdes.h"
00031 #include "mdes2.h"
00032
00033 #define RU_MAP_DEFAULT_SIZE 128
00034
00035 #define RU_MODE_ACYCLIC 0
00036 #define RU_MODE_CYCLIC 1
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 typedef struct _RU_Alloc_Header
00049 {
00050 struct _RU_Alloc_Header *next;
00051 } RU_Alloc_Header;
00052
00053 typedef struct _RU_Alloc_Data
00054 {
00055 RU_Alloc_Header *head;
00056 int allocated;
00057 int free;
00058 } RU_Alloc_Data;
00059
00060
00061
00062
00063
00064 #define RU_SELECTED_ALT(info)((Mdes_Alt *)(info->selected_alt))
00065 #define RU_SELECTED_ALT_ID(info)((int)(info->selected_alt->id))
00066
00067 typedef struct _RU_Info
00068 {
00069 struct legoOp *op;
00070 int proc_opc;
00071
00072
00073 int *pred;
00074 Mdes_Alt *selected_alt;
00075 int issue_time;
00076 int slot_used;
00077 } RU_Info;
00078
00079
00080
00081
00082
00083 typedef struct _RU_Node
00084 {
00085 RU_Info *info;
00086 SM_Choice *choice;
00087 int option_num;
00088 struct _RU_Node *prev_node;
00089 struct _RU_Node *next_node;
00090 } RU_Node;
00091
00092 typedef struct _RU_Map
00093 {
00094 int *resources_mask;
00095 RU_Node *first_node;
00096 RU_Node *last_node;
00097 } RU_Map;
00098
00099
00100
00101
00102
00103
00104
00105 extern RU_Map *RU_map;
00106 extern int RU_map_length;
00107 extern int RU_map_mode;
00108 extern int RU_map_cycles;
00109 extern int *RU_mask;
00110 extern int RU_mask_width;
00111 extern int RU_max_pred;
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 extern void RU_set_max_pred (int);
00123
00124
00125 extern int *RU_pred_alloc ();
00126
00127
00128 extern void RU_pred_free (int *);
00129
00130
00131 extern void RU_pred_print_alloc_data (FILE *, int);
00132
00133
00134
00135
00136
00137 extern RU_Info *RU_info_alloc ();
00138
00139
00140 extern void RU_info_free (RU_Info *);
00141
00142
00143 extern void RU_info_print_alloc_data (FILE *, int);
00144
00145
00146 extern RU_Info *RU_info_create (legoOp *, int *);
00147
00148
00149 extern void RU_info_delete (RU_Info *);
00150
00151
00152
00153
00154
00155 extern RU_Node *RU_node_alloc ();
00156
00157
00158 extern void RU_node_free (RU_Node *);
00159
00160
00161 extern void RU_node_print_alloc_data (FILE *, int);
00162
00163
00164 extern RU_Node *RU_node_create (RU_Info *);
00165
00166
00167 extern void RU_node_delete (RU_Map *, RU_Node *);
00168
00169
00170 extern void RU_node_delete_all (RU_Node *);
00171
00172
00173 extern void RU_node_insert_before (RU_Map *, RU_Node *, RU_Node *);
00174
00175
00176 extern void RU_node_insert_after (RU_Map *, RU_Node *, RU_Node *);
00177
00178
00179 extern RU_Node *RU_node_find (RU_Node *, RU_Info *, Mdes_Rused *);
00180
00181
00182
00183
00184
00185 extern void RU_map_create (int);
00186
00187
00188 extern void RU_map_realloc ();
00189
00190
00191 extern void RU_map_init (int, int);
00192
00193
00194
00195
00196 extern void RU_map_delete ();
00197
00198
00199
00200
00201
00202 extern int RU_number_of_alts(RU_Info *, Mdes_Info *, int);
00203
00204
00205 extern void RU_update_usage_count(RU_Info *, Mdes_Info *, int *, int);
00206
00207
00208
00209
00210
00211 extern int RU_alt_flags_compatible (RU_Info *, Mdes_Alt *, int);
00212
00213
00214 extern int RU_can_place (int, SM_Choice *, int);
00215
00216
00217 extern void RU_place (int, SM_Choice *, int, RU_Info *);
00218
00219
00220
00221 extern void RU_unplace (int, SM_Choice *, RU_Info *);
00222
00223
00224 extern int RU_schedule_op (RU_Info *, Mdes_Info *, int *, int, int, int, int);
00225
00226
00227
00228
00229 extern int RU_schedule_op_reverse (RU_Info *, Mdes_Info *, int *, int, int, int, int);
00230
00231
00232
00233
00234 extern int RU_can_schedule_op (RU_Info *, Mdes_Info *, int *, int, int, int, int);
00235
00236
00237
00238
00239 extern int RU_schedule_op_at (RU_Info *, Mdes_Info *, int *, int, int, int);
00240
00241
00242
00243
00244 extern void RU_unschedule_op (RU_Info *);
00245
00246
00247 #endif