import std
```
fn main(x: sN[17], a: sN[23], b: sN[23], c: sN[23]) ->sN[74] {
let x2: sN[34] = std::smul(x, x); // 1:1:32
let x3: sN[51] = std::smul(x2, x); // 1:2:48
// Before summing it to the final value, we need shift it
// left to match the fractional point. This is 50 - (16 + 2) = 32
let p1: sN[40] = std::smul(a, x);
let p1: sN[74] = p1 as sN[74];
let p1: sN[74] = p1 << sN[74]: 32;
// The fractional part is positioned at 2 + 32 = 34 index.
// The shift is then 50 - (32 + 2) = 14;
let p2: sN[57] = std::smul(b, x2);
let p2: sN[74] = p2 as sN[74];
let p2: sN[74] = p2 << sN[74]: 16;
// This doesn't need any shift.
let p3: sN[74] = std::smul(c, x3);
p1 + p2 + p3
}
as you can see most of the operations are full width.
and the pipeline seems to me split split according to the composition of the IR primitive functions.
Does xls offers a way to optionally change the width of the multiplication operations?
For instance, instead of keeping intact the 16 bits width multiplication, to split it into smaller multiplications and accs.
My intuition says that this shouldn't just be a problem of delays as I might want to reduce the width of some operations to spare BELs independently of the maximum of the maximum delay required to perform some operation.