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

Subversion Repositories heap_sorter

[/] [heap_sorter/] [trunk/] [HLS_implementation/] [Fig7/] [wz_hsort.cc] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 wzab
#include <stdlib.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include "wz_hsort.h"
5
 
6
sort_data l_smem[NM][SORT_LEN / 2] = { 0, };
7
sort_data r_smem[NM][SORT_LEN / 2] = { 0, };
8
 
9 9 wzab
sort_data heap_sort (sort_data val)
10 8 wzab
{
11
#pragma HLS INTERFACE ap_hs port=val
12
#pragma HSL INTERFACE ap_hs port=return
13
#pragma HLS DATA_PACK variable=val
14
#pragma HLS DATA_PACK variable=return
15
#pragma HLS DATA_PACK variable=l_smem
16
#pragma HLS DATA_PACK variable=r_smem
17
//#pragma HLS RESOURCE  variable=l_smem core=RAM_2P
18
//#pragma HLS RESOURCE  variable=r_smem core=RAM_2P
19
 
20
  //#pragma HLS DATAFLOW
21
#pragma HLS PIPELINE II=2
22
#pragma HLS ARRAY_PARTITION variable=l_smem complete dim=1
23
#pragma HLS ARRAY_PARTITION variable=r_smem complete dim=1
24
#pragma HLS UNROLL
25
  sort_data res;
26
  sort_data cur = val;
27
  int tmp;
28
  int pos;
29
  int lev;
30
  int shift;
31
  int offs = 0;
32
  int active;
33
  //We compare the input value with the memory on the top
34
  cur = r_smem[0][0];
35
  if (kle (val.key, cur.key))
36
    return val;
37
  else
38
    {                           //We start the update process
39
      res = cur;
40
      cur = val;
41
      pos = 0;
42
      active = 1;
43
      for (lev = 1; lev <= NM; lev++)
44
        {
45
          shift = 0;
46
          if (lev >= 2)
47
            shift = 1 << (lev - 2);
48
          if (active)
49
            {
50
              if ((lev == NM)
51
                  || (kle (cur.key, l_smem[lev][pos].key)
52
                      && kle (cur.key, r_smem[lev][pos].key)))
53
                {
54
                  if (pos < shift)
55
                    l_smem[lev - 1][pos] = cur;
56
                  else
57
                    r_smem[lev - 1][pos - shift] = cur;
58
                  active = 0;
59
                }
60
              else if (active
61
                       && klt (l_smem[lev][pos].key, cur.key)
62
                       && kle (l_smem[lev][pos].key, r_smem[lev][pos].key))
63
                {
64
                  if (pos < shift)
65
                    l_smem[lev - 1][pos] = l_smem[lev][pos];
66
                  else
67
                    r_smem[lev - 1][pos - shift] = l_smem[lev][pos];
68
                }
69
              else if (klt (r_smem[lev][pos].key, cur.key))
70
                {
71
                  if (pos < shift)
72
                    l_smem[lev - 1][pos] = r_smem[lev][pos];
73
                  else
74
                    r_smem[lev - 1][pos - shift] = r_smem[lev][pos];
75
                  pos += (1 << (lev - 1));
76
                }
77
              else
78
                {
79
                  printf ("impossible!!!\n");
80
                }
81
            }
82
        }
83
    }
84
  return res;
85
}

powered by: WebSVN 2.1.0

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