5. C HLS frontend
SiliconCompiler supports high-level synthesis of C code to any supported SC target, implemented using the Bambu HLS tool. To get started compiling C code with SC, ensure that SC is installed following the directions from the Installation section, and build Bambu from source following the instructions here. For Ubuntu 20.04, we’ve additionally provided a setup script.
To build a C design, the only things you need to do differently from a configuration perspective are:
Add all required C files as inputs.
Set the
['option', 'frontend']
parameter to ‘c’.
Otherwise, you can configure the build as normal.
For example, to implement a GCD function as a circuit, first copy the following into a file called “gcd.c”.
#include <stdio.h>
short gcd(short a, short b) {
if (b > a) {
short tmp = a;
a = b;
b = tmp;
}
while (a != 0 && b != 0) {
short r = a % b;
a = b;
b = r;
}
if (a == 0)
return b;
else
return a;
}
int main() {
printf("gcd(4, 4) = %d\n", gcd(4, 4));
printf("gcd(27, 36) = %d\n", gcd(27, 36));
printf("gcd(270, 192) = %d\n", gcd(270, 192));
return 0;
}
Note
SC’s C frontend driver script selects a function to implement as a Verilog module using the ‘design’ parameter. Ensure that your C code includes a function that matches the value stored in ‘design’.
This design can then be quickly compiled to a GDS using the command line:
sc gcd.c -frontend c
sc-show -design gcd
Or using Python:
import siliconcompiler
def main():
chip = siliconcompiler.Chip('gcd')
chip.input('gcd.c')
chip.set('option', 'frontend', 'c')
# default Bambu clock pin is 'clock'
chip.clock(pin='clock', period=5)
chip.load_target("freepdk45_demo")
chip.run()
chip.summary()
chip.show()
if __name__ == '__main__':
main()
For more information on the Bambu project used for implementing this frontend, see their docs.