summaryrefslogtreecommitdiffstats
path: root/baseline/source/dijkstra/dijkstra.c
diff options
context:
space:
mode:
Diffstat (limited to 'baseline/source/dijkstra/dijkstra.c')
-rw-r--r--baseline/source/dijkstra/dijkstra.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/baseline/source/dijkstra/dijkstra.c b/baseline/source/dijkstra/dijkstra.c
new file mode 100644
index 0000000..af86ea6
--- /dev/null
+++ b/baseline/source/dijkstra/dijkstra.c
@@ -0,0 +1,204 @@
1/*
2
3 This program is part of the TACLeBench benchmark suite.
4 Version V 2.0
5
6 Name: dijkstra
7
8 Author: unknown
9
10 Function: dijkstra finds the shortest path between nodes in a graph
11
12 Source: network section of MiBench
13
14 Changes: Made some variables local, compute checksum
15
16 License: GPL
17
18*/
19
20#include "../extra.h"
21#include "input.h"
22
23/*
24 Definitions of symbolic constants
25*/
26#define NONE 9999
27#define OUT_OF_MEMORY -1
28#define QUEUE_SIZE 1000
29
30/*
31 Type declarations
32*/
33struct _NODE {
34 int dist;
35 int prev;
36};
37
38struct _QITEM {
39 int node;
40 int dist;
41 int prev;
42 struct _QITEM *next;
43};
44
45/*
46 Global variable definitions
47*/
48struct _NODE dijkstra_rgnNodes[NUM_NODES];
49
50int dijkstra_queueCount;
51int dijkstra_queueNext;
52struct _QITEM *dijkstra_queueHead;
53struct _QITEM dijkstra_queueItems[QUEUE_SIZE];
54
55int dijkstra_checksum = 0;
56
57/*
58 Forward declaration of functions
59*/
60void dijkstra_init( void );
61int dijkstra_return( void );
62int dijkstra_enqueue( int node, int dist, int prev );
63void dijkstra_dequeue( int *node, int *dist, int *prev );
64int dijkstra_qcount( void );
65int dijkstra_find( int chStart, int chEnd );
66void dijkstra_main( void );
67//int main( void );
68
69void dijkstra_init( void )
70{
71 int i, k;
72 volatile int x = 0;
73 _Pragma( "loopbound min 100 max 100" )
74 for ( i = 0; i < NUM_NODES; i++ ) {
75 _Pragma( "loopbound min 100 max 100" )
76 for ( k = 0; k < NUM_NODES; k++ ) {
77 dijkstra_AdjMatrix[i][k] ^= x;
78 }
79 }
80
81 dijkstra_queueCount = 0;
82 dijkstra_queueNext = 0;
83 dijkstra_queueHead = ( struct _QITEM * )0;
84
85 dijkstra_checksum = 0;
86}
87
88int dijkstra_return( void )
89{
90 return ( ( dijkstra_checksum == 25 ) ? 0 : -1 );
91}
92
93int dijkstra_enqueue( int node, int dist, int prev )
94{
95 struct _QITEM *newItem = &dijkstra_queueItems[dijkstra_queueNext];
96 struct _QITEM *last = dijkstra_queueHead;
97
98 if ( ++dijkstra_queueNext >= QUEUE_SIZE )
99 return OUT_OF_MEMORY;
100 newItem->node = node;
101 newItem->dist = dist;
102 newItem->prev = prev;
103 newItem->next = 0;
104
105 if ( !last )
106 dijkstra_queueHead = newItem;
107 else {
108 /* TODO: where does this magic loop bound come from? */
109 _Pragma( "loopbound min 0 max 313" )
110 while ( last->next )
111 last = last->next;
112 last->next = newItem;
113 }
114 dijkstra_queueCount++;
115 return 0;
116}
117
118void dijkstra_dequeue( int *node, int *dist, int *prev )
119{
120 if ( dijkstra_queueHead ) {
121 *node = dijkstra_queueHead->node;
122 *dist = dijkstra_queueHead->dist;
123 *prev = dijkstra_queueHead->prev;
124 dijkstra_queueHead = dijkstra_queueHead->next;
125 dijkstra_queueCount--;
126 }
127}
128
129int dijkstra_qcount( void )
130{
131 return ( dijkstra_queueCount );
132}
133
134int dijkstra_find( int chStart, int chEnd )
135{
136 int ch;
137 int prev, node;
138 int cost, dist;
139 int i;
140
141 _Pragma( "loopbound min 100 max 100" )
142 for ( ch = 0; ch < NUM_NODES; ch++ ) {
143 dijkstra_rgnNodes[ch].dist = NONE;
144 dijkstra_rgnNodes[ch].prev = NONE;
145 }
146
147 if ( chStart == chEnd ) {
148 } else {
149 dijkstra_rgnNodes[chStart].dist = 0;
150 dijkstra_rgnNodes[chStart].prev = NONE;
151
152 if ( dijkstra_enqueue ( chStart, 0, NONE ) == OUT_OF_MEMORY )
153 return OUT_OF_MEMORY;
154
155 /* TODO: where does this magic loop bound come from? */
156 _Pragma( "loopbound min 618 max 928" )
157 while ( dijkstra_qcount() > 0 ) {
158 dijkstra_dequeue ( &node, &dist, &prev );
159 _Pragma( "loopbound min 100 max 100" )
160 for ( i = 0; i < NUM_NODES; i++ ) {
161 if ( ( cost = dijkstra_AdjMatrix[node][i] ) != NONE ) {
162 if ( ( NONE == dijkstra_rgnNodes[i].dist ) ||
163 ( dijkstra_rgnNodes[i].dist > ( cost + dist ) ) ) {
164 dijkstra_rgnNodes[i].dist = dist + cost;
165 dijkstra_rgnNodes[i].prev = node;
166 if ( dijkstra_enqueue ( i, dist + cost, node ) == OUT_OF_MEMORY )
167 return OUT_OF_MEMORY;
168 }
169 }
170 }
171 }
172 }
173 return 0;
174}
175
176void _Pragma( "entrypoint" ) dijkstra_main( void )
177{
178 int i, j;
179
180 /* finds 20 shortest paths between nodes */
181 _Pragma( "loopbound min 20 max 20" )
182 for ( i = 0, j = NUM_NODES / 2; i < 20; i++, j++ ) {
183 j = j % NUM_NODES;
184 if ( dijkstra_find( i, j ) == OUT_OF_MEMORY ) {
185 dijkstra_checksum += OUT_OF_MEMORY;
186 return;
187 } else
188 dijkstra_checksum += dijkstra_rgnNodes[j].dist;
189 dijkstra_queueNext = 0;
190 }
191}
192
193int main(int argc, char** argv )
194{
195 SET_UP
196 for(jobsComplete=-1; jobsComplete<maxJobs; jobsComplete++){
197 START_LOOP
198 dijkstra_init();
199 dijkstra_main();
200 STOP_LOOP
201 }
202 WRITE_TO_FILE
203 return ( dijkstra_return() );
204}