Abstract syntax for a synthesisable RTL (Verilog/VHDL) without provision for delays:
Expressions:
datatype ex_t =
    Num of int
  | Net of string
  | Inv of ex_t
  | Query of ex_t * ex_t * ex_t
  | Diadic of diop_t * ex_t * ex_t
  | Subscript of ex_t * ex_t
Imperative commands (might also include a 'case' statement) but
no loops.
datatype cmd_t =
    Assign of ex_t * ex_t
  | If1 of ex_t * cmd_t
  | If2 of ex_t * cmd_t * cmd_t
  | Block of cmd_t list
Our top level will be an unordered list of the following sentences:
datatype s_t = Sequential of edge_t * ex_t * cmd_t | Combinational of ex_t * ex_t