{-|
Module      : Ice40.GB
Description : Ice40 Global Buffer IP primtive
Copyright   : (c) David Cox, 2021
License     : BSD-3-Clause
Maintainer  : standardsemiconductor@gmail.com

Global buffer IP primitive from [Lattice Ice Technology Library](https://github.com/standardsemiconductor/VELDT-info/blob/master/SBTICETechnologyLibrary201708.pdf).
Required for a user's internally generated FPGA signal that is heavily loaded and requires global buffering; for example, a user's logic-generated clock.
-}
module Ice40.GB where

import Clash.Prelude
import Clash.Annotations.Primitive
import Data.String.Interpolate (i)
import Data.String.Interpolate.Util (unindent)

{-# ANN gbPrim (InlinePrimitive [Verilog] $ unindent [i|
  [  { "BlackBox" :
       { "name" : "Ice40.GB.gbPrim"
       , "kind" : "Declaration"
       , "type" :
  "gbPrim
    :: Clock dom -- ARG[0]
    -> Clock dom"
       , "template" :
  "//SB_GB begin
  SB_GB ~GENSYM[sb_gb_inst][0] (
    .USER_SIGNAL_TO_GLOBAL_BUFFER ( ~ARG[0] ),
    .GLOBAL_BUFFER_OUTPUT         ( ~RESULT )
  );
  //SB_GB end"
       }
     }
  ]
  |]) #-}

-- | Global buffer primitive
{-# NOINLINE gbPrim #-}
gbPrim :: Clock dom -> Clock dom
gbPrim :: Clock dom -> Clock dom
gbPrim !Clock dom
clk = Clock dom
clk