defmodule Danm do @moduledoc """ Public API for `Danm`. """ alias Danm.Library alias Danm.HtmlPrinting alias Danm.VerilogPrinting alias Danm.CheckDesign @doc ~S""" check design integrity and report errors and warnings. return false if there were errors optional arguments: * :check_warnings, when true, fail if there are warnings """ def check_design(s, options \\ []) do {warnings, errors} = CheckDesign.check_design(s) errors == 0 and (!options[:check_warnings] or warnings == 0) end @doc ~S""" generate a single verilog file that have everything. File name is deduced from the design name """ def generate_full_verilog(s, in: dir) do VerilogPrinting.generate_full_verilog(s, in: dir) end @doc ~S""" generate a full set of html files. top level is called top.html """ def generate_html_as_top(s, in: dir) do HtmlPrinting.generate_html_hier(s, in: dir) HtmlPrinting.generate_html(s, as: "top", in: dir) end @doc ~S""" build the design with "name" from top down optional arguments: * :verilog_path, a list of paths to search for verilog black boxes * :elixir_path, a list of paths to search for elixir schematics in exs * :parameters, a map of additional parameters to set to top level before elaborate """ def build(name, options \\ []) do Application.put_env(:danm, :verilog_path, options[:verilog_path] || []) Application.put_env(:danm, :elixir_path, options[:elixir_path] || []) Library.start() m = Library.load_and_build_module(name, options[:parameters] || %{}) Library.stop() m end @doc ~S""" build, check design, generate html and verilog for one or several designs, all in one go, with config pulled in from config file. In your config.exs, you may want to have: ``` elixir config :danm, top_modules: ["DESIGN1", "DESIGN2"], verilog_path: [PATH1, PATH2], elixir_path: [PATH3, PATH4], check_warning: true, default_params: %{ "DESIGN1" => %{ "SOMETHING" => VALUE, } } ``` Please see the other functions of this module to see find out the meaning of those configs. """ def auto_build(names) do output_dir = Application.get_env(:danm, :output_dir, "obj") default_params = Application.get_env(:danm, :default_params, %{}) check_warning = Application.get_env(:danm, :check_warning, false) File.mkdir_p!(output_dir) Library.start() names = List.wrap(names) Enum.each(names, fn name -> mod = Library.load_and_build_module(name, default_params[name] || %{}) unless check_design(mod, check_warnings: check_warning) do raise("check design failed for design #{name}") end File.mkdir_p!("#{output_dir}/#{name}_html") generate_html_as_top(mod, in: "#{output_dir}/#{name}_html") generate_full_verilog(mod, in: "#{output_dir}") end) Library.stop() end end