mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-08 04:20:49 +02:00
Implement LPM part select
This commit is contained in:
@@ -58,6 +58,30 @@ static int draw_binop_lpm(vhdl_arch *arch, ivl_lpm_t lpm, vhdl_binop_t op)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int draw_part_select_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||
{
|
||||
vhdl_var_ref *selfrom = nexus_to_var_ref(arch->get_scope(), ivl_lpm_data(lpm, 0));
|
||||
if (NULL == selfrom)
|
||||
return 1;
|
||||
|
||||
vhdl_expr *off = nexus_to_var_ref(arch->get_scope(), ivl_lpm_data(lpm, 1));
|
||||
if (NULL == off)
|
||||
return 1;
|
||||
|
||||
vhdl_var_ref *out = nexus_to_var_ref(arch->get_scope(), ivl_lpm_q(lpm, 0));
|
||||
if (NULL == out)
|
||||
return 1;
|
||||
|
||||
// Array indexes must be integers
|
||||
vhdl_type integer(VHDL_TYPE_INTEGER);
|
||||
off = off->cast(&integer);
|
||||
|
||||
selfrom->set_slice(off);
|
||||
arch->add_stmt(new vhdl_cassign_stmt(out, selfrom));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||
{
|
||||
switch (ivl_lpm_type(lpm)) {
|
||||
@@ -67,6 +91,8 @@ int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||
return draw_binop_lpm(arch, lpm, VHDL_BINOP_SUB);
|
||||
case IVL_LPM_MULT:
|
||||
return draw_binop_lpm(arch, lpm, VHDL_BINOP_MULT);
|
||||
case IVL_LPM_PART_VP:
|
||||
return draw_part_select_lpm(arch, lpm);
|
||||
default:
|
||||
error("Unsupported LPM type: %d", ivl_lpm_type(lpm));
|
||||
return 1;
|
||||
|
||||
@@ -56,6 +56,7 @@ public:
|
||||
|
||||
void emit(std::ofstream &of, int level) const;
|
||||
const std::string &get_name() const { return name_; }
|
||||
void set_slice(vhdl_expr *s) { slice_ = s; }
|
||||
private:
|
||||
std::string name_;
|
||||
vhdl_expr *slice_;
|
||||
|
||||
Reference in New Issue
Block a user