@@ -1768,6 +1768,94 @@ TEST_P(VastTest, SignedOperation) {
17681768endmodule)" );
17691769}
17701770
1771+ TEST_P (VastTest, WidthCastEmission) {
1772+ const SourceInfo si;
1773+ VerilogFile f (GetFileType ());
1774+ Module* m = f.AddModule (" top" , si);
1775+ XLS_ASSERT_OK_AND_ASSIGN (LogicRef * a,
1776+ m->AddInput (" a" , f.BitVectorType (8 , si), si));
1777+ XLS_ASSERT_OK_AND_ASSIGN (LogicRef * b,
1778+ m->AddInput (" b" , f.BitVectorType (4 , si), si));
1779+ XLS_ASSERT_OK_AND_ASSIGN (
1780+ LogicRef * out_literal,
1781+ m->AddOutput (" out_literal" , f.BitVectorType (8 , si), si));
1782+ XLS_ASSERT_OK_AND_ASSIGN (
1783+ LogicRef * out_param,
1784+ m->AddOutput (" out_param" , f.BitVectorType (12 , si), si));
1785+ XLS_ASSERT_OK_AND_ASSIGN (
1786+ LogicRef * out_expr,
1787+ m->AddOutput (" out_expr" , f.BitVectorType (16 , si), si));
1788+
1789+ ParameterRef* width_param =
1790+ m->AddParameter (" WidthParam" , f.PlainLiteral (12 , si), si);
1791+
1792+ m->Add <ContinuousAssignment>(
1793+ si, out_literal,
1794+ f.Make <WidthCast>(si, f.PlainLiteral (8 , si),
1795+ f.Add (a, f.PlainLiteral (1 , si), si)));
1796+ m->Add <ContinuousAssignment>(
1797+ si, out_param, f.Make <WidthCast>(si, width_param, f.Concat ({a, b}, si)));
1798+
1799+ Expression* complex_width = f.Add (width_param, f.PlainLiteral (4 , si), si);
1800+ Expression* complex_value =
1801+ f.BitwiseXor (a, f.Concat ({b, f.Literal (3 , 2 , si)}, si), si);
1802+ m->Add <ContinuousAssignment>(
1803+ si, out_expr, f.Make <WidthCast>(si, complex_width, complex_value));
1804+
1805+ EXPECT_EQ (m->Emit (nullptr ),
1806+ R"( module top(
1807+ input wire [7:0] a,
1808+ input wire [3:0] b,
1809+ output wire [7:0] out_literal,
1810+ output wire [11:0] out_param,
1811+ output wire [15:0] out_expr
1812+ );
1813+ parameter WidthParam = 12;
1814+ assign out_literal = 8'(a + 1);
1815+ assign out_param = WidthParam'({a, b});
1816+ assign out_expr = (WidthParam + 4)'(a ^ {b, 2'h3});
1817+ endmodule)" );
1818+ }
1819+
1820+ TEST_P (VastTest, TypeCastEmission) {
1821+ const SourceInfo si;
1822+ VerilogFile f (GetFileType ());
1823+ Module* m = f.AddModule (" top" , si);
1824+ XLS_ASSERT_OK_AND_ASSIGN (LogicRef * a,
1825+ m->AddInput (" a" , f.BitVectorType (8 , si), si));
1826+ XLS_ASSERT_OK_AND_ASSIGN (
1827+ LogicRef * out_foo,
1828+ m->AddOutput (" out_foo" ,
1829+ f.Make <ExternType>(si, f.BitVectorType (8 , si), " foobar" ),
1830+ si));
1831+ XLS_ASSERT_OK_AND_ASSIGN (
1832+ LogicRef * out_pkg,
1833+ m->AddOutput (" out_pkg" ,
1834+ f.Make <ExternPackageType>(si, " my_pkg" , " my_type_t" ), si));
1835+
1836+ // assign out_foo = foobar'(a + 1);
1837+ m->Add <ContinuousAssignment>(
1838+ si, out_foo,
1839+ f.Make <TypeCast>(si,
1840+ f.Make <ExternType>(si, f.BitVectorType (8 , si), " foobar" ),
1841+ f.Add (a, f.PlainLiteral (1 , si), si)));
1842+ // assign out_pkg = my_pkg::my_type_t'(a);
1843+ m->Add <ContinuousAssignment>(
1844+ si, out_pkg,
1845+ f.Make <TypeCast>(si, f.Make <ExternPackageType>(si, " my_pkg" , " my_type_t" ),
1846+ a));
1847+
1848+ EXPECT_EQ (m->Emit (nullptr ),
1849+ R"( module top(
1850+ input wire [7:0] a,
1851+ output foobar out_foo,
1852+ output my_pkg::my_type_t out_pkg
1853+ );
1854+ assign out_foo = foobar'(a + 1);
1855+ assign out_pkg = my_pkg::my_type_t'(a);
1856+ endmodule)" );
1857+ }
1858+
17711859TEST_P (VastTest, ComplexConditional) {
17721860 VerilogFile f (GetFileType ());
17731861 Module* m = f.AddModule (" top" , SourceInfo ());
0 commit comments