Skip to content

Rebase main #70

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e3df73a
Merge pull request #27 from MicrochipTech/dev
duc-tran-mchp Dec 28, 2022
ca93412
Merge pull request #30 from MicrochipTech/dev
duc-tran-mchp Apr 13, 2023
b361134
Merge pull request #44 from MicrochipTech/dev
ShuranXuMCHP Aug 18, 2023
b25719e
Revert "Merge dev to main for release 2023.2"
ShuranXuMCHP Aug 18, 2023
9c8ca83
Merge pull request #46 from MicrochipTech/revert-44-dev
ShuranXuMCHP Aug 18, 2023
fba750a
Revert "Revert "Merge dev to main for release 2023.2""
duc-tran-mchp Aug 21, 2023
d762f3e
Merge pull request #48 from MicrochipTech/revert-46-revert-44-dev
duc-tran-mchp Aug 21, 2023
0cb286f
Merge pull request #49 from MicrochipTech/dev
duc-tran-mchp Aug 21, 2023
3df5106
Added risc-v example
ManuelSaldana Nov 8, 2023
7f3bc85
Merge pull request #50 from MicrochipTech/risc-v-demo
Alireza-Mellat Nov 8, 2023
b85ce1b
Add '-D__STDC_FORMAT_MACROS' to USER_CXX_FLAG of axi_target test
LindaMongMCHP Jan 22, 2024
834a01e
Merge pull request #52 from MicrochipTech/add_STDC_FORMAT_MACROS_to_a…
LindaMongMCHP Jan 22, 2024
f9f6514
Fixed synthesis error for 2024_1 release
ManuelSaldana Feb 1, 2024
9c40903
Merge pull request #54 from MicrochipTech/fix_synth_error_2024_1
ManuelSaldana Feb 1, 2024
85cfa03
RISC-V Demo Windows Support 2024 (#56)
jennifermah76 Feb 20, 2024
bf7d016
SmartHLS 2024.1 Changes (#57)
jennifermah76 Feb 20, 2024
d22cabe
Fixed doc links to point to new SHLS documentation (#58)
jennifermah76 Feb 21, 2024
d014c95
Update readme.md (#59)
ManuelSaldana Feb 22, 2024
12d7f02
Canny RISCV Demo (#60)
jennifermah76 Mar 4, 2024
8b5b4ec
Update User Guide Links (#61)
jennifermah76 Mar 8, 2024
b92bb4f
Fixed incorrect path returned by getHLSPaths function. (#62)
ManuelSaldana Mar 28, 2024
ad489be
Merge pull request #64 from MicrochipTech/dev
duc-tran-mchp Apr 1, 2024
336ff9c
Change name="LegUp" to name="SmartHLS" in all IDE-generated files
hassan-elsheikha Jun 25, 2024
bff8a3c
Merge pull request #67 from MicrochipTech/update-project-files
hassan-elsheikha Jul 2, 2024
34fb56f
Revert "Change name="LegUp" to name="SmartHLS" in all IDE-generated f…
hassan-elsheikha Jul 3, 2024
6a35f32
Merge pull request #68 from MicrochipTech/revert-67-update-project-files
hassan-elsheikha Jul 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# don't modify line endings of bash scripts
*.sh text eol=lf
*.job filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.wic.gz filter=lfs diff=lfs merge=lfs -text
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.vscode/**
**/hls_output
risc-v-demo/precompiled/**/ffmpeg*
risc-v-demo/precompiled/**/opencv*
risc-v-demo/sev-kit-reference-design/SEVPFSOC_H264
risc-v-demo/sev-kit-reference-design/component
risc-v-demo/sev-kit-reference-design/script_support/additional_configurations/smarthls/hls_pipeline/component
risc-v-demo/sev-kit-reference-design/script_support/additional_configurations/smarthls/hls_pipeline/*.elf
64 changes: 64 additions & 0 deletions Canny_RISCV/.cproject
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="legup.managedbuild.config.gnu.exe.release.353525777">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="legup.managedbuild.config.gnu.exe.release.353525777" moduleId="org.eclipse.cdt.core.settings" name="LegUp">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="legup.managedbuild.config.gnu.exe.release.353525777" name="LegUp" parent="legup.managedbuild.config.gnu.exe.release">
<folderInfo id="legup.managedbuild.config.gnu.exe.release.353525777." name="/" resourcePath="">
<toolChain id="legup.managedbuild.toolchain.gnu.exe.release.1446885488" name="Linux GCC" superClass="legup.managedbuild.toolchain.gnu.exe.release">
<targetPlatform id="legup.managedbuild.target.gnu.platform.exe.release.1222145006" name="Debug Platform" superClass="legup.managedbuild.target.gnu.platform.exe.release"/>
<builder buildPath="${workspace_loc:/k}/" id="com.legup.managedbuild.makefileGenerator.1284874661" keepEnvironmentInBuildfile="false" superClass="com.legup.managedbuild.makefileGenerator"/>
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1544502953" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
<tool id="legup.managedbuild.tool.gnu.cpp.compiler.exe.debug.376673803" name="GCC C++ Compiler" superClass="legup.managedbuild.tool.gnu.cpp.compiler.exe.debug">
<option id="gnu.cpp.compiler.option.optimization.level.1759095256" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.debugging.level.1810804837" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.dialect.std.2033344015" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.c++11" valueType="enumerated"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1733918208" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
<tool id="legup.managedbuild.tool.gnu.c.compiler.exe.debug.994173059" name="GCC C Compiler" superClass="legup.managedbuild.tool.gnu.c.compiler.exe.debug">
<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1472888521" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option id="gnu.c.compiler.option.debugging.level.254071885" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.731311993" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.base.235767834" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base">
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1347301496" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="legup.managedbuild.tool.gnu.cpp.linker.exe.debug.574591359" name="GCC C++ Linker" superClass="legup.managedbuild.tool.gnu.cpp.linker.exe.debug">
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.247544963" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="legup.managedbuild.tool.gnu.assembler.exe.debug.457984043" name="GCC Assembler" superClass="legup.managedbuild.tool.gnu.assembler.exe.debug">
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1374461430" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="k.legup.managedbuild.target.gnu.exe.1049438793" name="Executable" projectType="legup.managedbuild.target.gnu.exe"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="legup.managedbuild.config.gnu.exe.release.353525777;legup.managedbuild.config.gnu.exe.release.353525777.;legup.managedbuild.tool.gnu.c.compiler.exe.debug.994173059;cdt.managedbuild.tool.gnu.c.compiler.input.731311993">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>
27 changes: 27 additions & 0 deletions Canny_RISCV/.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Canny_RISCV</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
</natures>
</projectDescription>
19 changes: 19 additions & 0 deletions Canny_RISCV/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
########## This file is automatically generated. Any changes to this file will be lost. ##########
########## If you have your own custom Makefile, please name it Makefile.user. ##########
NAME = Canny
LOCAL_CONFIG = -legup-config=config.tcl
SRCS = canny.cpp gaussian_filter.cpp hysteresis_filter.cpp nonmaximum_suppression.cpp sobel_filter.cpp util.cpp
GUI_BASE_DIR =
LEVEL = $(SHLS_ROOT_DIR)/examples


USER_CXX_FLAG += -O3 -pg -Wall -Wno-strict-aliasing -Wno-unused-label -Wno-unknown-pragmas -Wno-attributes -I$(SHLS_ROOT_DIR)/smarthls-library

INPUT_FILES_RISCV += toronto.bmp
OUTPUT_FILES_RISCV += output.bmp

ifneq ("$(wildcard $(GUI_BASE_DIR)Makefile.user)","")
include $(GUI_BASE_DIR)Makefile.user
endif
include $(LEVEL)/Makefile.common

87 changes: 87 additions & 0 deletions Canny_RISCV/bmp.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#ifndef __PPM_H__
#define __PPM_H__

#include "hls/ap_int.hpp"
#include "define.hpp"

using namespace hls;

// bit width of a pixel
const int W = 8;

// 24-bit RGB
typedef ap_uint<3*W> rgb_t;

// 7:0 blue
const int B2 = 0;
const int B1 = B2 + W-1;

// 15:8 green
const int G2 = W;
const int G1 = G2 + W-1;

// 23:16 red
const int R2 = 2*W;
const int R1 = R2 + W-1;

struct input_t {
rgb_t channel1;
rgb_t channel2;
ap_uint<8> alpha;
};

#define SIZE (WIDTH*HEIGHT)

struct bmp_pixel_t {
unsigned char b;
unsigned char g;
unsigned char r;
};

// Total: 54 bytes
struct bmp_header_t {
uint16_t type; // Magic identifier: 0x4d42
uint32_t size; // File size in bytes
uint32_t reserved; // Not used
uint32_t offset; // Offset to image data in bytes from beginning of file (54 bytes)
uint32_t dib_header_size; // DIB Header size in bytes (40 bytes)
int32_t width; // Width of the image
int32_t height; // Height of image
uint16_t num_planes; // Number of color planes
uint16_t bits_per_pixel; // Bits per pixel
uint32_t compression; // Compression type
uint32_t image_size; // Image size in bytes
int32_t x_resolution_ppm; // Pixels per meter
int32_t y_resolution_ppm; // Pixels per meter
uint32_t num_colors; // Number of colors
uint32_t important_colors; // Important colors
} __attribute__((__packed__));

bmp_pixel_t *read_bmp(const char *filename, bmp_header_t *header) {
FILE *file = fopen(filename, "rb");
if (!file) return NULL;

// read BMP header and verify width/height
if (fread(header, sizeof(bmp_header_t), 1, file) != 1) return NULL;
if (header->offset != sizeof(bmp_header_t) ||
header->width != WIDTH || header->height != HEIGHT) return NULL;

// allocate image buffer
bmp_pixel_t *image = (bmp_pixel_t*)malloc(SIZE * sizeof(bmp_pixel_t));

// read BMP image
if (fread(image, sizeof(bmp_pixel_t), SIZE, file) != SIZE) return NULL;

fclose(file);
return image;
}

void write_bmp(const char *filename, const bmp_header_t *header, const bmp_pixel_t *image) {
FILE *file = fopen(filename, "wb");
if (!file) return;
fwrite(header, sizeof(bmp_header_t), 1, file);
fwrite(image, sizeof(bmp_pixel_t), SIZE, file);
fclose(file);
}

#endif
99 changes: 99 additions & 0 deletions Canny_RISCV/canny.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@

#include "define.hpp"
#include "bmp.hpp"
#include "hls/hls_alloc.h"

#include <assert.h>


#ifndef __SYNTHESIS__
// For software, the fifo depth has to be larger
#define FIFO_DEPTH SIZE
#else
#define FIFO_DEPTH 2
#endif

void write_fifo(unsigned char *buf, hls::FIFO<unsigned char> &out_fifo, int nWords) {
#pragma HLS loop pipeline
for(int i=0; i<nWords; i++) {
auto tmp = buf[i];
out_fifo.write(tmp);
}
}

void read_fifo(hls::FIFO<unsigned char> &in_fifo, unsigned char *buf, int nWords) {
#pragma HLS loop pipeline
for(int i=0; i<nWords; i++) {
auto wd = in_fifo.read();
buf[i] = wd;
}
}


void canny(hls::FIFO<unsigned char> &input_fifo,
hls::FIFO<unsigned char> &output_fifo) {

#pragma HLS function dataflow
hls::FIFO<unsigned char> output_fifo_gf(FIFO_DEPTH);
hls::FIFO<unsigned short> output_fifo_sf(FIFO_DEPTH);
hls::FIFO<unsigned char> output_fifo_nm(FIFO_DEPTH);

gaussian_filter(input_fifo, output_fifo_gf);
sobel_filter(output_fifo_gf, output_fifo_sf);
nonmaximum_suppression(output_fifo_sf, output_fifo_nm);
hysteresis_filter(output_fifo_nm, output_fifo);
}

void canny_wrapper(unsigned char *bufIn, unsigned char *bufOut) {
#pragma HLS function top dataflow
#pragma HLS interface default type(axi_target)
#pragma HLS interface argument(bufIn) type(axi_initiator) num_elements(SIZE) max_burst_len(256)
#pragma HLS interface argument(bufOut) type(axi_initiator) num_elements(SIZE) max_burst_len(256)

hls::FIFO<unsigned char> fifo_1(FIFO_DEPTH);
hls::FIFO<unsigned char> fifo_2(FIFO_DEPTH);
write_fifo(bufIn, fifo_1, SIZE);
canny(fifo_1, fifo_2);
read_fifo(fifo_2, bufOut, SIZE);
}

int main() {
bmp_header_t input_channel_header;
bmp_pixel_t *input_channel, *output_channel, *tmp;

input_channel = read_bmp(INPUT_IMAGE, &input_channel_header);
if (!input_channel) return 1;

output_channel = (bmp_pixel_t*)malloc(SIZE * sizeof(bmp_pixel_t));
if (!output_channel) return 1;

unsigned char *bufIn = (unsigned char *)hls_malloc(SIZE);
unsigned char *bufOut = (unsigned char *)hls_malloc(SIZE);

for (int i = 0; i < SIZE; i++) {
unsigned char r = input_channel->r;
unsigned char g = input_channel->g;
unsigned char b = input_channel->b;
unsigned grayscale = (r + g + b) / 3;
bufIn[i] = grayscale;
input_channel++;
}

canny_wrapper(bufIn, bufOut);

tmp = output_channel;
for (int i = 0; i < SIZE; i++) {
tmp->r = bufOut[i];
tmp->g = bufOut[i];
tmp->b = bufOut[i];
tmp++;
}

write_bmp("output.bmp", &input_channel_header, output_channel);

hls_free(bufIn);
hls_free(bufOut);

return 0;
}

7 changes: 7 additions & 0 deletions Canny_RISCV/config.tcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
########## This file is automatically generated. Any changes to this file will be lost. ##########
########## If you have your own constraints tcl file, please add it to the project ##########
########## by using the "Set custom config file" constraint in the HLS Constraints dialog. ##########
source $env(SHLS_ROOT_DIR)/examples/legup.tcl
set_project PolarFireSoC MPFS250T Icicle_SoC

set_parameter CLOCK_PERIOD 10
55 changes: 55 additions & 0 deletions Canny_RISCV/define.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#ifndef __DEFINE_H__
#define __DEFINE_H__

#include "hls/ap_int.hpp"
#include "hls/streaming.hpp"

// uncomment this line to test on a smaller image for faster co-simulation
//#define FAST_COSIM

#ifdef FAST_COSIM
#define WIDTH 100
#define HEIGHT 56
#define INPUT_IMAGE "toronto_100x56.bmp"
#define GOLDEN_OUTPUT "golden_output_100x56.bmp"
#else
#define WIDTH 1920
#define HEIGHT 1080
#define INPUT_IMAGE "toronto.bmp"
#define GOLDEN_OUTPUT "golden_output.bmp"
#endif
#define SIZE (WIDTH*HEIGHT)

void window_and_line_buffer(hls::ap_uint<10> input,
hls::ap_uint<10> window[3][3]);

// Gaussian Filter.
const unsigned int GF_KERNEL_SIZE = 5;
void gaussian_filter(hls::FIFO<unsigned char> &input_fifo,
hls::FIFO<unsigned char> &output_fifo);
void gf_sw(unsigned char input[][WIDTH], unsigned char output[][WIDTH]);

// Sobel Filter.
const unsigned int SF_KERNEL_SIZE = 3;
void sf_sw(unsigned char input[][WIDTH], hls::ap_uint<10> output[][WIDTH]);
void sobel_filter(hls::FIFO<unsigned char> &input_fifo,
hls::FIFO<unsigned short> &output_fifo);

// Non-maximum suppression.
const unsigned int NM_KERNEL_SIZE = 3;
void nonmaximum_suppression(hls::FIFO<unsigned short> &input_fifo,
hls::FIFO<unsigned char> &output_fifo);
void nm_sw(hls::ap_uint<10> input[][WIDTH], unsigned char output[][WIDTH]);

// Hysteresis filter.
const unsigned int HF_KERNEL_SIZE = 3;
void hf_sw(unsigned char input[][WIDTH], unsigned char output[][WIDTH]);
void hysteresis_filter(hls::FIFO<unsigned char> &input_fifo,
hls::FIFO<unsigned char> &output_fifo);

// Utility functions
bool is_filled(unsigned int kernel_size, unsigned int count);
bool is_out_of_bounds(unsigned int kernel_size, unsigned int i, unsigned int j);
void update_image_position(unsigned int &i, unsigned int &j);

#endif
Loading