Source file xilinx_intf.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(** Basic Xilinx FPGA primitives *)
open! Import
module type S = sig
val lut : int64 -> Signal.t -> Signal.t
val muxcy : Signal.t -> Signal.t -> Signal.t -> Signal.t
val inv : Signal.t -> Signal.t
val xorcy : Signal.t -> Signal.t -> Signal.t
val muxf5 : Signal.t -> Signal.t -> Signal.t -> Signal.t
val muxf6 : Signal.t -> Signal.t -> Signal.t -> Signal.t
val muxf7 : Signal.t -> Signal.t -> Signal.t -> Signal.t
val muxf8 : Signal.t -> Signal.t -> Signal.t -> Signal.t
val fdce : Signal.t -> Signal.t -> Signal.t -> Signal.t -> Signal.t
val fdpe : Signal.t -> Signal.t -> Signal.t -> Signal.t -> Signal.t
val mult_and : Signal.t -> Signal.t -> Signal.t
val ram1s : Signal.t -> Signal.t -> Signal.t -> Signal.t -> Signal.t
end
module type T = sig
module LutEqn : sig
type t
end
val x_lut : LutEqn.t -> Signal.t -> Signal.t
val x_map : LutEqn.t -> Signal.t list -> Signal.t
val x_and : Signal.t -> Signal.t -> Signal.t
val x_or : Signal.t -> Signal.t -> Signal.t
val x_xor : Signal.t -> Signal.t -> Signal.t
val x_not : Signal.t -> Signal.t
val x_reduce_carry
: bool
-> (LutEqn.t -> LutEqn.t -> LutEqn.t)
-> Signal.t
-> Signal.t
-> Signal.t
-> Signal.t
val x_and_reduce : Signal.t -> Signal.t
val x_or_reduce : Signal.t -> Signal.t
val x_reduce_tree : (LutEqn.t -> LutEqn.t -> LutEqn.t) -> Signal.t -> Signal.t
val x_add_carry : LutEqn.t -> Signal.t -> Signal.t -> Signal.t -> Signal.t * Signal.t
val x_add : Signal.t -> Signal.t -> Signal.t
val x_sub : Signal.t -> Signal.t -> Signal.t
val x_mux_add_carry
: LutEqn.t
-> Signal.t
-> Signal.t
-> Signal.t * Signal.t
-> Signal.t
-> Signal.t * Signal.t
(** [x_mux_add x (a, a') b] gives [(x ? a : a') + b] *)
val x_mux_add : Signal.t -> Signal.t * Signal.t -> Signal.t -> Signal.t
(** [x_mux_sub x a (b, b')] gives [a - (x ? b : b')] *)
val x_mux_sub : Signal.t -> Signal.t -> Signal.t * Signal.t -> Signal.t
val x_eq : Signal.t -> Signal.t -> Signal.t
val x_lt : Signal.t -> Signal.t -> Signal.t
val x_mux : Signal.t -> Signal.t list -> Signal.t
val x_mulu : Signal.t -> Signal.t -> Signal.t
val x_muls : Signal.t -> Signal.t -> Signal.t
end
module type Xilinx = sig
module type S = S
(** Allow expressions to generate LUT init values *)
module LutEqn : sig
type t
val i0 : t
val i1 : t
val i2 : t
val i3 : t
val i4 : t
val i5 : t
val gnd : t
val vdd : t
val ( &: ) : t -> t -> t
val ( |: ) : t -> t -> t
val ( ^: ) : t -> t -> t
val ( ~: ) : t -> t
val ( ==: ) : t -> t -> t
val ( <>: ) : t -> t -> t
val eval : int -> t -> int64
end
(** Hardcaml simulation based models of Xilinx primitives *)
module Hardcaml_api : S
(** Unisim library based Xilinx primitives *)
module Unisim : S
module type T = T with module LutEqn := LutEqn
module type LutSize = sig
val max_lut : int
end
module Lut4 : LutSize
module Lut6 : LutSize
module XMake (X : S) (L : LutSize) : T
module XComb (Synth : T) : Comb.Primitives with type t = Signal.t
(** combinatorial only transform *)
module XSynthesizeComb (X : S) (L : LutSize) : Transform.TransformFn
(** sequential and combinatorial transform TODO memories *)
module XSynthesize (X : S) (L : LutSize) : Transform.TransformFn
end