- BlackBox:
    name: Clash.Xilinx.DDR.iddr#
    kind: Declaration
    type: |-
      iddr#
        :: forall n dom domDDR
         . HasCallStack                 -- ARG[0]
        => KnownDomain dom              -- ARG[1]
        => KnownDomain domDDR           -- ARG[2]
        => DomPeriod ~ 2 * ...          -- ARG[3]
        => DomEdge ~ Rising             -- ARG[4]
        => KnownNat n                   -- ARG[5]
        => Clock dom                    -- ARG[6]
        -> Reset dom                    -- ARG[7]
        -> Enable dom                   -- ARG[8]
        -> Signal domDDR (BitVector n)  -- ARG[9]
        -> Signal dom (BitVector n, BitVector n)
    template: |-
      // iddr begin
      ~SIGD[~GENSYM[data_pos][1]][9];
      ~SIGD[~GENSYM[data_neg][2]][9];
      ~SIGD[~GENSYM[d][3]][9];
      assign ~SYM[3] = ~ARG[9];

      genvar ~GENSYM[i][8];
      ~GENERATE
      for (~SYM[8]=0; ~SYM[8] < ~SIZE[~TYP[9]]; ~SYM[8]=~SYM[8]+1) begin : ~GENSYM[ddri_array][7]
        IDDR #(
          .DDR_CLK_EDGE("SAME_EDGE"),
          .INIT_Q1(1'b0),
          .INIT_Q2(1'b0),
          .SRTYPE(~IF ~ISSYNC[1] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)
        ) ~GENSYM[~COMPNAME_IDDR][9] (
          .Q1(~SYM[1][~SYM[8]]),
          .Q2(~SYM[2][~SYM[8]]),
          .C(~ARG[6]),
          .CE(~IF ~ISACTIVEENABLE[8] ~THEN ~ARG[8] ~ELSE 1'b1 ~FI),
          .D(~SYM[3][~SYM[8]]),
          .R(~ARG[7]),
          .S(1'b0)
        );
      end
      ~ENDGENERATE

      assign ~RESULT = {~SYM[2],~SYM[1]};
      // iddr end
- BlackBox:
    name: Clash.Xilinx.DDR.oddr#
    kind: Declaration
    type: |-
      oddr#
        :: forall n dom domDDR
         . HasCallStack              -- ARG[0]
        => KnownDomain dom           -- ARG[1]
        => KnownDomain domDDR        -- ARG[2]
        => DomPeriod ~ 2 * ...       -- ARG[3]
        => DomEdge ~ Rising          -- ARG[4]
        => KnownNat n                -- ARG[5]
        => Clock dom                 -- ARG[6]
        -> Reset dom                 -- ARG[7]
        -> Enable dom                -- ARG[8]
        -> Signal dom (BitVector n)  -- ARG[9]
        -> Signal dom (BitVector n)  -- ARG[10]
        -> Signal domDDR (BitVector n)
    template: |-
      // oddr begin
      ~SIGD[~GENSYM[data_pos][1]][10];
      ~SIGD[~GENSYM[data_neg][2]][10];
      ~SIGD[~GENSYM[q][3]][10];

      assign ~SYM[1] = ~ARG[9];
      assign ~SYM[2] = ~ARG[10];

      genvar ~GENSYM[i][8];
      ~GENERATE
      for (~SYM[8]=0; ~SYM[8] < ~SIZE[~TYP[10]]; ~SYM[8]=~SYM[8]+1) begin : ~GENSYM[ddro_array][7]
        ODDR #(
          .DDR_CLK_EDGE("SAME_EDGE"),
          .INIT(1'b0),
          .SRTYPE(~IF ~ISSYNC[1] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)
        ) ~GENSYM[~COMPNAME_ODDR][9] (
          .Q(~SYM[3][~SYM[8]]),
          .C(~ARG[6]),
          .CE(~IF ~ISACTIVEENABLE[8] ~THEN ~ARG[8] ~ELSE 1'b1 ~FI),
          .D1(~SYM[1][~SYM[8]]),
          .D2(~SYM[2][~SYM[8]]),
          .R(~ARG[7]),
          .S(1'b0)
        );
      end
      ~ENDGENERATE

      assign ~RESULT = ~SYM[3];
      // oddr end