Exemple #1
0
    def test_mandelbrot(self):
        translator = xlscc_translator.Translator("mypackage")

        my_parser = ext_c_parser.XLSccParser()

        source_path = runfiles.get_path(
            "xls/contrib/xlscc/translate/testdata/mandelbrot_test.cc")
        binary_path = runfiles.get_path(
            "xls/contrib/xlscc/translate/mandelbrot_test")

        nx = 48
        ny = 32

        with open(source_path) as f:
            content = f.read()

        # Hackily do the preprocessing, since in build environments we do not have a
        # cpp binary available (and if we did relying on it here without a
        # build-system-noted dependency would be non-hermetic).
        content = re.sub("^#if !NO_TESTBENCH$.*^#endif$", "", content, 0,
                         re.MULTILINE | re.DOTALL)
        content = re.sub(re.compile("//.*?\n"), "", content)

        f = self.create_tempfile(content=content)
        ast = pycparser.parse_file(f.full_path,
                                   use_cpp=False,
                                   parser=my_parser)

        cpp_out = None
        with os.popen(binary_path) as osf:
            cpp_out = osf.read()
        parsed_cpp_out = eval(cpp_out)

        translator.parse(ast)

        p = translator.gen_ir()
        f = p.get_function("mandelbrot")

        result_arr = parsed_cpp_out

        for y in range(0, ny):
            for x in range(0, nx):
                xx = float(x) / nx
                yy = float(y) / ny

                xi = int(xx * 2.5 - 1.8) * (1 << 16)
                yi = int(yy * 2.2 - 1.1) * (1 << 16)

                args = dict(c_r=ir_value.Value(
                    bits_mod.SBits(value=int(xi), bit_count=32)),
                            c_i=ir_value.Value(
                                bits_mod.SBits(value=int(yi), bit_count=32)))

                result = ir_interpreter.run_function_kwargs(f, args)

                result_sai32 = int(str(result))
                result_arr[y][x] = result_sai32

        self.assertEqual(parsed_cpp_out, result_arr)
Exemple #2
0
 def parse_and_get_function(self,
                            source,
                            hls_types_by_name=None,
                            channels_in=None,
                            channels_out=None):
   hls_types_by_name = hls_types_by_name if hls_types_by_name else {}
   translator = xlscc_translator.Translator("mypackage", hls_types_by_name,
                                            channels_in, channels_out)
   my_parser = ext_c_parser.XLSccParser()
   my_parser.is_intrinsic_type = translator.is_intrinsic_type
   ast = my_parser.parse(source, "test_input")
   translator.parse(ast)
   p = translator.gen_ir()
   return p.get_function("test")
Exemple #3
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("cpp", help="C++ file to process.")
    parser.add_argument("output_filename", help="XLS IR file output path.")
    parser.add_argument("-T",
                        "--types_proto",
                        help="Parse types from protobuffer.",
                        default=None)
    parser.add_argument("-D",
                        "--define",
                        help="Define a preprocessor symbol.",
                        action="append",
                        default=[])
    parser.add_argument("--channel_in",
                        help="Define an input channel.",
                        action="append",
                        default=[])
    parser.add_argument("--channel_out",
                        help="Define an output channel.",
                        action="append",
                        default=[])
    parser.add_argument("-N",
                        "--package_name",
                        help="Package name.",
                        default="test_package")
    parser.add_argument("-W",
                        "--wrapper",
                        help="Generate a wrapper file at path.",
                        default=None)
    args = parser.parse_args()

    hls_types_by_name = {}

    if args.types_proto:
        with open(args.types_proto, mode="rb") as proto_file:
            file_content = proto_file.read()
            hls_types = hls_types_pb2.HLSTypes()
            if args.types_proto.endswith("pb"):
                hls_types.ParseFromString(file_content)
            elif args.types_proto.endswith("pbtext"):
                text_format.Parse(file_content, hls_types)
            else:
                print("Unknown extension for protobuf: {args.types_proto}",
                      file=sys.stderr)
                sys.exit(1)

            for named_type in hls_types.hls_types:
                hls_types_by_name[named_type.name] = named_type.hls_type

    translator = xlscc_translator.Translator(args.package_name,
                                             hls_types_by_name,
                                             args.channel_in, args.channel_out)

    my_parser = ext_c_parser.XLSccParser()
    my_parser.is_intrinsic_type = translator.is_intrinsic_type
    defines = ["-DHLS_STATIC=static", "-D__SYNTHESIS__=1"]
    defines += ["-D" + d for d in args.define]
    ast = pycparser.parse_file(args.cpp,
                               use_cpp=True,
                               cpp_args=defines,
                               parser=my_parser)

    translator.parse(ast)

    with open(args.output_filename, "w") as text_file:
        text_file.write(translator.gen_ir().dump_ir())