calyx 0.7.1

Compiler Infrastructure for Hardware Accelerator Generation
extern "binary_operators.sv" {
  /// =================== Unsigned, Fixed Point =========================
  comb primitive std_fp_add<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) ->(out: WIDTH);

  comb primitive std_fp_sub<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH)->(out: WIDTH);

  primitive std_fp_mult_pipe<"state_share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @interval(3) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out: WIDTH,
    @done done: 1
  );

  primitive std_fp_div_pipe<"state_share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out_remainder: WIDTH,
    @stable out_quotient: WIDTH,
    @done done: 1
  );

  comb primitive std_fp_gt<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) -> (out: 1);

  /// =================== Signed, Fixed Point =========================
  comb primitive std_fp_sadd<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);

  comb primitive std_fp_ssub<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);

  primitive std_fp_smult_pipe<"state_share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @interval(3) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out: WIDTH,
    @done done: 1
  );

  primitive std_fp_sdiv_pipe<"state_share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out_remainder: WIDTH,
    @stable out_quotient: WIDTH,
    @done done: 1
  );

  comb primitive std_fp_sgt<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) -> (out: 1);

  comb primitive std_fp_slt<"share"=1>[
    WIDTH, INT_WIDTH, FRAC_WIDTH
  ](@data left: WIDTH, @data right: WIDTH) -> (out: 1);

  /// =================== Unsigned, Bitnum =========================
  /// Other unsigned bitnum primitives are found in the core library,
  /// since they're required for FSM encoding.
  primitive std_mult_pipe<"state_share"=1>[WIDTH](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @interval(3) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out: WIDTH,
    @done done: 1
  );

  primitive std_div_pipe<"state_share"=1>[WIDTH](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out_quotient: WIDTH,
    @stable out_remainder: WIDTH,
    @done done: 1
  );

  /// =================== Signed, Bitnum =========================
  comb primitive std_sadd<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);
  comb primitive std_ssub<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);

  primitive std_smult_pipe<"state_share"=1>[WIDTH](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @interval(3) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    @stable out: WIDTH,
    @done done: 1
  );

  primitive std_sdiv_pipe[WIDTH](
    @clk clk: 1,
    @reset reset: 1,
    @write_together(1) @go go: 1,
    @write_together(1) @data left: WIDTH,
    @write_together(1) @data right: WIDTH
  ) -> (
    out_quotient: WIDTH,
    out_remainder: WIDTH,
    @done done: 1
  );

  comb primitive std_sgt<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_slt<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_seq<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_sneq<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_sge<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_sle<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: 1);
  comb primitive std_slsh<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);
  comb primitive std_srsh<"share"=1>[WIDTH](@data left: WIDTH, @data right: WIDTH) -> (out: WIDTH);
  comb primitive std_signext<"share"=1>[IN_WIDTH, OUT_WIDTH](@data in: IN_WIDTH) -> (out: OUT_WIDTH);
}