Generate process for sequential UDPs
This commit is contained in:
parent
d7b85c42a0
commit
a577ee447b
|
|
@ -161,7 +161,51 @@ static void comb_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
|
|
||||||
static void seq_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
static void seq_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
{
|
{
|
||||||
error("Sequential UDP devices not supported yet");
|
ivl_udp_t udp = ivl_logic_udp(log);
|
||||||
|
|
||||||
|
// These will be translated to a process with a single
|
||||||
|
// case statement
|
||||||
|
|
||||||
|
vhdl_process *proc = new vhdl_process(ivl_logic_basename(log));
|
||||||
|
|
||||||
|
ostringstream ss;
|
||||||
|
ss << "Generated from UDP " << ivl_udp_name(udp);
|
||||||
|
proc->set_comment(ss.str().c_str());
|
||||||
|
|
||||||
|
// Create a variable to hold the concatenation of the inputs
|
||||||
|
int msb = ivl_udp_nin(udp) - 1;
|
||||||
|
vhdl_type *tmp_type = vhdl_type::std_logic_vector(msb, 0);
|
||||||
|
proc->get_scope()->add_decl(new vhdl_var_decl("UDP_Inputs", tmp_type));
|
||||||
|
|
||||||
|
// Concatenate the inputs into a single expression that can be
|
||||||
|
// used as the test in a case statement (this can't be inserted
|
||||||
|
// directly into the case statement due to the requirement that
|
||||||
|
// the test expression be "locally static")
|
||||||
|
int nin = ivl_udp_nin(udp);
|
||||||
|
vhdl_expr *tmp_rhs = NULL;
|
||||||
|
if (nin == 1) {
|
||||||
|
vhdl_var_ref *ref =
|
||||||
|
nexus_to_var_ref(arch->get_scope(), ivl_logic_pin(log, 1));
|
||||||
|
tmp_rhs = ref->cast(tmp_type);
|
||||||
|
proc->add_sensitivity(ref->get_name());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vhdl_binop_expr *concat = new vhdl_binop_expr(VHDL_BINOP_CONCAT, NULL);
|
||||||
|
|
||||||
|
for (int i = 1; i < nin; i++) {
|
||||||
|
vhdl_var_ref *ref =
|
||||||
|
nexus_to_var_ref(arch->get_scope(), ivl_logic_pin(log, i));
|
||||||
|
concat->add_expr(ref);
|
||||||
|
proc->add_sensitivity(ref->get_name());
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_rhs = concat;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc->get_container()->add_stmt
|
||||||
|
(new vhdl_assign_stmt(new vhdl_var_ref("UDP_Inputs", NULL), tmp_rhs));
|
||||||
|
|
||||||
|
arch->add_stmt(proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
static void udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ void vhdl_arch::emit(std::ostream &of, int level) const
|
||||||
blank_line(of, level); // Extra blank line after architectures;
|
blank_line(of, level); // Extra blank line after architectures;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_process::add_sensitivity(const char *name)
|
void vhdl_process::add_sensitivity(const std::string &name)
|
||||||
{
|
{
|
||||||
sens_.push_back(name);
|
sens_.push_back(name);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -724,7 +724,7 @@ public:
|
||||||
vhdl_process(const char *name = "") : name_(name) {}
|
vhdl_process(const char *name = "") : name_(name) {}
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
void add_sensitivity(const char *name);
|
void add_sensitivity(const std::string &name);
|
||||||
private:
|
private:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
string_list_t sens_;
|
string_list_t sens_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue