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

Subversion Repositories heap_sorter

[/] [heap_sorter/] [trunk/] [HLS_implementation/] [Fig5/] [wz_hsort.cc] - Rev 8

Compare with Previous | Blame | View Log

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "wz_hsort.h"
 
sort_data sort_mem[NM][SORT_LEN];
sort_data heap_sort (sort_data val)
{
#pragma HLS PIPELINE II=2
#pragma HLS INTERFACE ap_hs port=val
#pragma HLS DATA_PACK variable=val
#pragma HLS INTERFACE ap_ctrl_hs port=return
#pragma HLS DATA_PACK variable=return
#pragma HLS ARRAY_PARTITION variable=sort_mem dim=1
	sort_data res;
	sort_data cur = val;
	int lev, offs, top, left, right, enable;
	cur = sort_mem[0][0];
	if (kcmp(val.key,cur.key) <= 0)
		return val;			//No need to update the heap
	else
	{
		res = cur;
		cur = val;
		offs = 0;
		enable = 1;
		for (lev = 1; lev <= NM; lev++)
		{
			top = offs;
			left = offs;
			right = (1 << (lev - 1)) + offs;
			if(enable){
				if ((lev == NM) ||
						((kcmp(cur.key,sort_mem[lev][left].key) <= 0) &&
								(kcmp(cur.key,sort_mem[lev][right].key) <= 0)))
				{
					sort_mem[lev-1][top] = cur;
					enable=0;
				}
				else if ((kcmp(sort_mem[lev][left].key,cur.key) < 0) &&
						(kcmp(sort_mem[lev][left].key,sort_mem[lev][right].key) <= 0))
				{
					sort_mem[lev-1][top] = sort_mem[lev][left];
				}
				else if (kcmp(sort_mem[lev][right].key,cur.key)<0)
				{
					sort_mem[lev-1][top] = sort_mem[lev][right];
					offs += (1 << (lev - 1));
				}
				else
				{
					printf ("impossible!!!\n");
				}
			}
		}
	}
	return res;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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