package hardcaml

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file instantiation.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
open! Import

type instobj = < i : string -> Signal.t ; o : string -> Signal.t >

let create
      ?(lib = "work")
      ?(arch = "rtl")
      ?instance
      ?(parameters = [])
      ()
      ~name
      ~inputs
      ~outputs
  =
  (* filter empty/0 width IOs *)
  (* {[
       let inputs = List.filter (fun (_, s) -> s <> Empty) inputs in
       let outputs = List.filter (fun (_, b) -> b <> 0) outputs in
     ]} *)
  let width = List.fold outputs ~init:0 ~f:(fun a (_, i) -> a + i) in
  let deps = List.map inputs ~f:snd in
  let outputs, _ =
    List.fold outputs ~init:([], 0) ~f:(fun (o, a) (n, w) -> (n, (w, a)) :: o, a + w)
  in
  let signal =
    Signal.Inst
      { signal_id = Signal.make_id width deps
      ; extra_uid = Signal.new_id ()
      ; instantiation =
          { inst_name = name
          ; inst_instance =
              (match instance with
               | None -> "the_" ^ name
               | Some i -> i)
          ; inst_generics = parameters
          ; inst_inputs = inputs
          ; inst_outputs = outputs
          ; inst_lib = lib
          ; inst_arch = arch
          }
      }
  in
  let find name =
    let w, o = List.Assoc.find_exn outputs name ~equal:String.equal in
    Signal.select signal (o + w - 1) o
  in
  object
    method i name = List.Assoc.find_exn inputs name ~equal:String.equal

    method o name = find name
  end
;;

module With_interface (I : Interface.S) (O : Interface.S) = struct
  let create ?lib ?arch ?instance ?parameters ~name inputs =
    let t =
      create
        ()
        ?lib
        ?arch
        ?instance
        ?parameters
        ~name
        ~inputs:(I.to_list (I.map2 I.t inputs ~f:(fun (n, _) s -> n, s)))
        ~outputs:(O.to_list O.t)
    in
    O.map O.t ~f:(fun (n, _) -> t#o n)
  ;;
end
OCaml

Innovation. Community. Security.