2018-07-21 01:41:18 -05:00
|
|
|
/* -*- c++ -*-
|
2013-01-05 04:13:26 -06:00
|
|
|
* yosys -- Yosys Open SYnthesis Suite
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
|
2015-07-02 04:14:30 -05:00
|
|
|
*
|
2013-01-05 04:13:26 -06:00
|
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
2015-07-02 04:14:30 -05:00
|
|
|
*
|
2013-01-05 04:13:26 -06:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*
|
|
|
|
* ---
|
|
|
|
*
|
|
|
|
* This is the AST frontend library.
|
|
|
|
*
|
|
|
|
* The AST frontend library is not a frontend on it's own but provides a
|
|
|
|
* generic abstract syntax tree (AST) abstraction for HDL code and can be
|
|
|
|
* used by HDL frontends. See "ast.h" for an overview of the API and the
|
|
|
|
* Verilog frontend for an usage example.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef AST_H
|
|
|
|
#define AST_H
|
|
|
|
|
|
|
|
#include "kernel/rtlil.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <set>
|
|
|
|
|
2014-07-31 06:19:47 -05:00
|
|
|
YOSYS_NAMESPACE_BEGIN
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
namespace AST
|
|
|
|
{
|
|
|
|
// all node types, type2str() must be extended
|
|
|
|
// whenever a new node type is added here
|
|
|
|
enum AstNodeType
|
|
|
|
{
|
|
|
|
AST_NONE,
|
|
|
|
AST_DESIGN,
|
|
|
|
AST_MODULE,
|
|
|
|
AST_TASK,
|
|
|
|
AST_FUNCTION,
|
2014-08-21 05:43:51 -05:00
|
|
|
AST_DPI_FUNCTION,
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
AST_WIRE,
|
|
|
|
AST_MEMORY,
|
|
|
|
AST_AUTOWIRE,
|
|
|
|
AST_PARAMETER,
|
|
|
|
AST_LOCALPARAM,
|
2013-07-04 07:12:33 -05:00
|
|
|
AST_DEFPARAM,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_PARASET,
|
|
|
|
AST_ARGUMENT,
|
|
|
|
AST_RANGE,
|
2014-08-06 08:43:46 -05:00
|
|
|
AST_MULTIRANGE,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_CONSTANT,
|
2014-06-13 04:29:23 -05:00
|
|
|
AST_REALVALUE,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_CELLTYPE,
|
|
|
|
AST_IDENTIFIER,
|
2013-02-26 06:18:22 -06:00
|
|
|
AST_PREFIX,
|
2014-01-18 21:18:22 -06:00
|
|
|
AST_ASSERT,
|
2015-02-26 11:47:39 -06:00
|
|
|
AST_ASSUME,
|
2017-02-25 03:36:39 -06:00
|
|
|
AST_LIVE,
|
|
|
|
AST_FAIR,
|
2017-02-04 07:14:26 -06:00
|
|
|
AST_COVER,
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
AST_FCALL,
|
2014-02-01 06:50:23 -06:00
|
|
|
AST_TO_BITS,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_TO_SIGNED,
|
|
|
|
AST_TO_UNSIGNED,
|
|
|
|
AST_CONCAT,
|
|
|
|
AST_REPLICATE,
|
|
|
|
AST_BIT_NOT,
|
|
|
|
AST_BIT_AND,
|
|
|
|
AST_BIT_OR,
|
|
|
|
AST_BIT_XOR,
|
|
|
|
AST_BIT_XNOR,
|
|
|
|
AST_REDUCE_AND,
|
|
|
|
AST_REDUCE_OR,
|
|
|
|
AST_REDUCE_XOR,
|
|
|
|
AST_REDUCE_XNOR,
|
|
|
|
AST_REDUCE_BOOL,
|
|
|
|
AST_SHIFT_LEFT,
|
|
|
|
AST_SHIFT_RIGHT,
|
|
|
|
AST_SHIFT_SLEFT,
|
|
|
|
AST_SHIFT_SRIGHT,
|
|
|
|
AST_LT,
|
|
|
|
AST_LE,
|
|
|
|
AST_EQ,
|
|
|
|
AST_NE,
|
2013-12-27 06:50:08 -06:00
|
|
|
AST_EQX,
|
|
|
|
AST_NEX,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_GE,
|
|
|
|
AST_GT,
|
|
|
|
AST_ADD,
|
|
|
|
AST_SUB,
|
|
|
|
AST_MUL,
|
|
|
|
AST_DIV,
|
|
|
|
AST_MOD,
|
|
|
|
AST_POW,
|
|
|
|
AST_POS,
|
|
|
|
AST_NEG,
|
|
|
|
AST_LOGIC_AND,
|
|
|
|
AST_LOGIC_OR,
|
|
|
|
AST_LOGIC_NOT,
|
|
|
|
AST_TERNARY,
|
|
|
|
AST_MEMRD,
|
|
|
|
AST_MEMWR,
|
2015-02-14 03:49:30 -06:00
|
|
|
AST_MEMINIT,
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
AST_TCALL,
|
|
|
|
AST_ASSIGN,
|
|
|
|
AST_CELL,
|
|
|
|
AST_PRIMITIVE,
|
2014-06-07 04:48:50 -05:00
|
|
|
AST_CELLARRAY,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_ALWAYS,
|
2013-03-31 04:19:11 -05:00
|
|
|
AST_INITIAL,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_BLOCK,
|
|
|
|
AST_ASSIGN_EQ,
|
|
|
|
AST_ASSIGN_LE,
|
|
|
|
AST_CASE,
|
|
|
|
AST_COND,
|
2016-04-21 08:31:54 -05:00
|
|
|
AST_CONDX,
|
|
|
|
AST_CONDZ,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_DEFAULT,
|
|
|
|
AST_FOR,
|
2014-02-14 13:33:22 -06:00
|
|
|
AST_WHILE,
|
2014-06-06 10:40:04 -05:00
|
|
|
AST_REPEAT,
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
AST_GENVAR,
|
|
|
|
AST_GENFOR,
|
|
|
|
AST_GENIF,
|
2013-12-04 14:06:54 -06:00
|
|
|
AST_GENCASE,
|
2013-01-05 04:13:26 -06:00
|
|
|
AST_GENBLOCK,
|
|
|
|
|
|
|
|
AST_POSEDGE,
|
|
|
|
AST_NEGEDGE,
|
2016-06-18 03:24:21 -05:00
|
|
|
AST_EDGE,
|
|
|
|
|
2018-10-11 16:33:31 -05:00
|
|
|
AST_INTERFACE,
|
|
|
|
AST_INTERFACEPORT,
|
|
|
|
AST_INTERFACEPORTTYPE,
|
2018-10-12 13:58:37 -05:00
|
|
|
AST_MODPORT,
|
|
|
|
AST_MODPORTMEMBER,
|
2016-06-18 03:24:21 -05:00
|
|
|
AST_PACKAGE
|
2013-01-05 04:13:26 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
// convert an node type to a string (e.g. for debug output)
|
|
|
|
std::string type2str(AstNodeType type);
|
|
|
|
|
|
|
|
// The AST is built using instances of this struct
|
|
|
|
struct AstNode
|
|
|
|
{
|
2014-12-28 20:11:50 -06:00
|
|
|
// for dict<> and pool<>
|
|
|
|
unsigned int hashidx_;
|
|
|
|
unsigned int hash() const { return hashidx_; }
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// this nodes type
|
|
|
|
AstNodeType type;
|
|
|
|
|
|
|
|
// the list of child nodes for this node
|
|
|
|
std::vector<AstNode*> children;
|
|
|
|
|
|
|
|
// the list of attributes assigned to this node
|
|
|
|
std::map<RTLIL::IdString, AstNode*> attributes;
|
2013-10-24 04:20:13 -05:00
|
|
|
bool get_bool_attribute(RTLIL::IdString id);
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
// node content - most of it is unused in most node types
|
|
|
|
std::string str;
|
|
|
|
std::vector<RTLIL::State> bits;
|
2019-05-27 12:07:46 -05:00
|
|
|
bool is_input, is_output, is_reg, is_logic, is_signed, is_string, is_wand, is_wor, range_valid, range_swapped, was_checked, is_unsized;
|
2013-01-05 04:13:26 -06:00
|
|
|
int port_id, range_left, range_right;
|
|
|
|
uint32_t integer;
|
2014-06-13 04:29:23 -05:00
|
|
|
double realvalue;
|
2013-01-05 04:13:26 -06:00
|
|
|
|
2014-08-06 08:43:46 -05:00
|
|
|
// if this is a multirange memory then this vector contains offset and length of each dimension
|
|
|
|
std::vector<int> multirange_dimensions;
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// this is set by simplify and used during RTLIL generation
|
|
|
|
AstNode *id2ast;
|
|
|
|
|
2014-01-20 13:25:20 -06:00
|
|
|
// this is used by simplify to detect if basic analysis has been performed already on the node
|
|
|
|
bool basic_prep;
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// this is the original sourcecode location that resulted in this AST node
|
|
|
|
// it is automatically set by the constructor using AST::current_filename and
|
|
|
|
// the AST::get_line_num() callback function.
|
|
|
|
std::string filename;
|
|
|
|
int linenum;
|
|
|
|
|
|
|
|
// creating and deleting nodes
|
2016-07-27 08:40:17 -05:00
|
|
|
AstNode(AstNodeType type = AST_NONE, AstNode *child1 = NULL, AstNode *child2 = NULL, AstNode *child3 = NULL);
|
2017-09-29 23:37:38 -05:00
|
|
|
AstNode *clone() const;
|
|
|
|
void cloneInto(AstNode *other) const;
|
2013-01-05 04:13:26 -06:00
|
|
|
void delete_children();
|
|
|
|
~AstNode();
|
|
|
|
|
2013-11-21 06:49:00 -06:00
|
|
|
enum mem2reg_flags
|
|
|
|
{
|
|
|
|
/* status flags */
|
|
|
|
MEM2REG_FL_ALL = 0x00000001,
|
|
|
|
MEM2REG_FL_ASYNC = 0x00000002,
|
|
|
|
MEM2REG_FL_INIT = 0x00000004,
|
|
|
|
|
|
|
|
/* candidate flags */
|
|
|
|
MEM2REG_FL_FORCED = 0x00000100,
|
|
|
|
MEM2REG_FL_SET_INIT = 0x00000200,
|
|
|
|
MEM2REG_FL_SET_ELSE = 0x00000400,
|
|
|
|
MEM2REG_FL_SET_ASYNC = 0x00000800,
|
|
|
|
MEM2REG_FL_EQ2 = 0x00001000,
|
2014-06-17 14:39:25 -05:00
|
|
|
MEM2REG_FL_CMPLX_LHS = 0x00002000,
|
2019-03-01 15:35:09 -06:00
|
|
|
MEM2REG_FL_CONST_LHS = 0x00004000,
|
|
|
|
MEM2REG_FL_VAR_LHS = 0x00008000,
|
2013-11-21 06:49:00 -06:00
|
|
|
|
|
|
|
/* proc flags */
|
|
|
|
MEM2REG_FL_EQ1 = 0x01000000,
|
|
|
|
};
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// simplify() creates a simpler AST by unrolling for-loops, expanding generate blocks, etc.
|
|
|
|
// it also sets the id2ast pointers so that identifier lookups are fast in genRTLIL()
|
2014-02-14 12:56:44 -06:00
|
|
|
bool simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, int width_hint, bool sign_hint, bool in_param);
|
2015-07-31 03:40:09 -05:00
|
|
|
AstNode *readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr, bool unconditional_init);
|
2013-01-05 04:13:26 -06:00
|
|
|
void expand_genblock(std::string index_var, std::string prefix, std::map<std::string, std::string> &name_map);
|
2014-08-05 05:15:53 -05:00
|
|
|
void replace_ids(const std::string &prefix, const std::map<std::string, std::string> &rules);
|
2014-12-28 20:11:50 -06:00
|
|
|
void mem2reg_as_needed_pass1(dict<AstNode*, pool<std::string>> &mem2reg_places,
|
|
|
|
dict<AstNode*, uint32_t> &mem2reg_flags, dict<AstNode*, uint32_t> &proc_flags, uint32_t &status_flags);
|
2016-08-21 06:23:58 -05:00
|
|
|
bool mem2reg_as_needed_pass2(pool<AstNode*> &mem2reg_set, AstNode *mod, AstNode *block, AstNode *&async_block);
|
2014-12-28 20:11:50 -06:00
|
|
|
bool mem2reg_check(pool<AstNode*> &mem2reg_set);
|
2016-05-27 10:25:33 -05:00
|
|
|
void mem2reg_remove(pool<AstNode*> &mem2reg_set, vector<AstNode*> &delnodes);
|
2013-01-05 04:13:26 -06:00
|
|
|
void meminfo(int &mem_width, int &mem_size, int &addr_bits);
|
|
|
|
|
2014-02-14 12:56:44 -06:00
|
|
|
// additional functionality for evaluating constant functions
|
|
|
|
struct varinfo_t { RTLIL::Const val; int offset; bool is_signed; };
|
2014-06-06 17:02:05 -05:00
|
|
|
bool has_const_only_constructs(bool &recommend_const_eval);
|
2014-02-14 12:56:44 -06:00
|
|
|
void replace_variables(std::map<std::string, varinfo_t> &variables, AstNode *fcall);
|
|
|
|
AstNode *eval_const_function(AstNode *fcall);
|
2019-03-02 14:36:46 -06:00
|
|
|
bool is_simple_const_expr();
|
2014-02-14 12:56:44 -06:00
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// create a human-readable text representation of the AST (for debugging)
|
2017-09-29 23:37:38 -05:00
|
|
|
void dumpAst(FILE *f, std::string indent) const;
|
|
|
|
void dumpVlog(FILE *f, std::string indent) const;
|
2013-01-05 04:13:26 -06:00
|
|
|
|
2013-07-09 07:31:57 -05:00
|
|
|
// used by genRTLIL() for detecting expression width and sign
|
2014-06-16 08:00:57 -05:00
|
|
|
void detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *found_real = NULL);
|
|
|
|
void detectSignWidth(int &width_hint, bool &sign_hint, bool *found_real = NULL);
|
2013-07-09 07:31:57 -05:00
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
// create RTLIL code for this AST node
|
|
|
|
// for expressions the resulting signal vector is returned
|
|
|
|
// all generated cell instances, etc. are written to the RTLIL::Module pointed to by AST_INTERNAL::current_module
|
2013-07-09 07:31:57 -05:00
|
|
|
RTLIL::SigSpec genRTLIL(int width_hint = -1, bool sign_hint = false);
|
2014-12-28 12:24:24 -06:00
|
|
|
RTLIL::SigSpec genWidthRTLIL(int width, const dict<RTLIL::SigBit, RTLIL::SigBit> *new_subst_ptr = NULL);
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
// compare AST nodes
|
|
|
|
bool operator==(const AstNode &other) const;
|
|
|
|
bool operator!=(const AstNode &other) const;
|
|
|
|
bool contains(const AstNode *other) const;
|
|
|
|
|
|
|
|
// helper functions for creating AST nodes for constants
|
|
|
|
static AstNode *mkconst_int(uint32_t v, bool is_signed, int width = 32);
|
2019-05-27 04:42:10 -05:00
|
|
|
static AstNode *mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed, bool is_unsized);
|
2013-01-05 04:13:26 -06:00
|
|
|
static AstNode *mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed);
|
2013-12-05 06:26:17 -06:00
|
|
|
static AstNode *mkconst_str(const std::vector<RTLIL::State> &v);
|
2013-12-05 05:53:49 -06:00
|
|
|
static AstNode *mkconst_str(const std::string &str);
|
2013-11-02 07:00:17 -05:00
|
|
|
|
|
|
|
// helper function for creating sign-extended const objects
|
|
|
|
RTLIL::Const bitsAsConst(int width, bool is_signed);
|
|
|
|
RTLIL::Const bitsAsConst(int width = -1);
|
2019-05-27 04:42:10 -05:00
|
|
|
RTLIL::Const bitsAsUnsizedConst(int width);
|
2013-12-04 07:14:05 -06:00
|
|
|
RTLIL::Const asAttrConst();
|
|
|
|
RTLIL::Const asParaConst();
|
2014-08-21 10:11:51 -05:00
|
|
|
uint64_t asInt(bool is_signed);
|
2017-09-29 23:37:38 -05:00
|
|
|
bool bits_only_01() const;
|
|
|
|
bool asBool() const;
|
2014-06-14 01:51:22 -05:00
|
|
|
|
|
|
|
// helper functions for real valued const eval
|
2017-09-29 23:37:38 -05:00
|
|
|
int isConst() const; // return '1' for AST_CONSTANT and '2' for AST_REALVALUE
|
2014-06-14 01:51:22 -05:00
|
|
|
double asReal(bool is_signed);
|
2014-06-14 13:38:05 -05:00
|
|
|
RTLIL::Const realAsConst(int width);
|
2013-01-05 04:13:26 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
// process an AST tree (ast must point to an AST_DESIGN node) and generate RTLIL code
|
2019-03-21 14:52:29 -05:00
|
|
|
void process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump_ast2, bool no_dump_ptr, bool dump_vlog1, bool dump_vlog2, bool dump_rtlil, bool nolatches, bool nomeminit,
|
2019-04-20 15:24:50 -05:00
|
|
|
bool nomem2reg, bool mem2reg, bool noblackbox, bool lib, bool nowb, bool noopt, bool icells, bool nooverwrite, bool overwrite, bool defer, bool autowire);
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
// parametric modules are supported directly by the AST library
|
2015-08-14 03:56:05 -05:00
|
|
|
// therefore we need our own derivate of RTLIL::Module with overloaded virtual functions
|
2013-01-05 04:13:26 -06:00
|
|
|
struct AstModule : RTLIL::Module {
|
|
|
|
AstNode *ast;
|
2019-04-20 15:24:50 -05:00
|
|
|
bool nolatches, nomeminit, nomem2reg, mem2reg, noblackbox, lib, nowb, noopt, icells, autowire;
|
2018-07-21 01:41:18 -05:00
|
|
|
~AstModule() YS_OVERRIDE;
|
|
|
|
RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, bool mayfail) YS_OVERRIDE;
|
2018-10-12 13:58:37 -05:00
|
|
|
RTLIL::IdString derive(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, dict<RTLIL::IdString, RTLIL::Module*> interfaces, dict<RTLIL::IdString, RTLIL::IdString> modports, bool mayfail) YS_OVERRIDE;
|
2018-10-11 16:33:31 -05:00
|
|
|
std::string derive_common(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Const> parameters, AstNode **new_ast_out, bool mayfail);
|
|
|
|
void reprocess_module(RTLIL::Design *design, dict<RTLIL::IdString, RTLIL::Module *> local_interfaces) YS_OVERRIDE;
|
2018-07-21 01:41:18 -05:00
|
|
|
RTLIL::Module *clone() const YS_OVERRIDE;
|
2013-01-05 04:13:26 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
// this must be set by the language frontend before parsing the sources
|
|
|
|
// the AstNode constructor then uses current_filename and get_line_num()
|
|
|
|
// to initialize the filename and linenum properties of new nodes
|
|
|
|
extern std::string current_filename;
|
|
|
|
extern void (*set_line_num)(int);
|
|
|
|
extern int (*get_line_num)();
|
|
|
|
|
2013-11-24 10:29:11 -06:00
|
|
|
// set set_line_num and get_line_num to internal dummy functions (done by simplify() and AstModule::derive
|
|
|
|
// to control the filename and linenum properties of new nodes not generated by a frontend parser)
|
2013-01-05 04:13:26 -06:00
|
|
|
void use_internal_line_num();
|
2014-08-21 05:43:51 -05:00
|
|
|
|
|
|
|
// call a DPI function
|
|
|
|
AstNode *dpi_call(const std::string &rtype, const std::string &fname, const std::vector<std::string> &argtypes, const std::vector<AstNode*> &args);
|
2018-10-20 05:45:51 -05:00
|
|
|
|
|
|
|
// Helper functions related to handling SystemVerilog interfaces
|
|
|
|
std::pair<std::string,std::string> split_modport_from_type(std::string name_type);
|
|
|
|
AstNode * find_modport(AstNode *intf, std::string name);
|
|
|
|
void explode_interface_port(AstNode *module_ast, RTLIL::Module * intfmodule, std::string intfname, AstNode *modport);
|
2013-01-05 04:13:26 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace AST_INTERNAL
|
|
|
|
{
|
|
|
|
// internal state variables
|
2018-08-23 07:19:46 -05:00
|
|
|
extern bool flag_dump_ast1, flag_dump_ast2, flag_no_dump_ptr, flag_dump_rtlil, flag_nolatches, flag_nomeminit;
|
2016-07-27 08:40:17 -05:00
|
|
|
extern bool flag_nomem2reg, flag_mem2reg, flag_lib, flag_noopt, flag_icells, flag_autowire;
|
2013-01-05 04:13:26 -06:00
|
|
|
extern AST::AstNode *current_ast, *current_ast_mod;
|
|
|
|
extern std::map<std::string, AST::AstNode*> current_scope;
|
2014-12-28 12:24:24 -06:00
|
|
|
extern const dict<RTLIL::SigBit, RTLIL::SigBit> *genRTLIL_subst_ptr;
|
2014-08-14 16:02:07 -05:00
|
|
|
extern RTLIL::SigSpec ignoreThisSignalsInInitial;
|
2015-02-14 03:49:30 -06:00
|
|
|
extern AST::AstNode *current_always, *current_top_block, *current_block, *current_block_child;
|
2013-01-05 04:13:26 -06:00
|
|
|
extern AST::AstModule *current_module;
|
2016-09-06 10:34:42 -05:00
|
|
|
extern bool current_always_clocked;
|
2013-01-05 04:13:26 -06:00
|
|
|
struct ProcessGenerator;
|
|
|
|
}
|
|
|
|
|
2014-07-31 06:19:47 -05:00
|
|
|
YOSYS_NAMESPACE_END
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
#endif
|