diff --git a/Changes b/Changes index bb6993224..78fdb4a77 100644 --- a/Changes +++ b/Changes @@ -12,6 +12,8 @@ The contributors that suggested a given feature are shown in []. Thanks! **** Fix false ALWCOMBORDER on interface references, bug1247. [Josh Redford] +**** Fix constant propagation across DPI imports of inout strings. [Victor Besyakov] + * Verilator 3.916 2017-11-25 diff --git a/src/V3Task.cpp b/src/V3Task.cpp index 87a57f28d..00d7cacec 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -386,6 +386,9 @@ private: pinp->v3error("Function/task output connected to constant instead of variable: "+portp->prettyName()); } else if (portp->isInout()) { + // Correct lvalue; see comments below + V3LinkLValue::linkLValueSet(pinp); + if (AstVarRef* varrefp = pinp->castVarRef()) { // Connect to this exact variable AstVarScope* localVscp = varrefp->varScopep(); if (!localVscp) varrefp->v3fatalSrc("Null var scope"); @@ -489,6 +492,9 @@ private: pinp->v3error("Function/task output connected to constant instead of variable: "+portp->prettyName()); } else if (portp->isInout()) { + // Correct lvalue; see comments below + V3LinkLValue::linkLValueSet(pinp); + if (pinp->castVarRef()) { // Connect to this exact variable } else { diff --git a/test_regress/t/t_dpi_import.v b/test_regress/t/t_dpi_import.v index 5f9cd0c1a..5e45da2bd 100644 --- a/test_regress/t/t_dpi_import.v +++ b/test_regress/t/t_dpi_import.v @@ -59,7 +59,7 @@ module t (/*AUTOARG*/ import "DPI-C" pure function void dpii_v_struct (input str_t i, output str_t o); import "DPI-C" pure function void dpii_v_substruct(input substr_t i, output int o); import "DPI-C" pure function void dpii_v_chandle (input chandle i, output chandle o); - import "DPI-C" pure function void dpii_v_string (input string i, output string o); + import "DPI-C" pure function void dpii_v_string (input string i, inout string o); import "DPI-C" pure function void dpii_v_real (input real i, output real o); import "DPI-C" pure function void dpii_v_uint (input int unsigned i, output int unsigned o);