From: Robert Jordens Date: Thu, 4 Sep 2014 00:27:13 +0000 (-0600) Subject: cordic: vivado is bad at inferring compact adder/subtractor logic X-Git-Tag: 24jan2021_ls180~2099^2~308 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=683643266fbfb6388e0d1a8e0548bdb1e8f117a0;p=litex.git cordic: vivado is bad at inferring compact adder/subtractor logic --- diff --git a/migen/genlib/cordic.py b/migen/genlib/cordic.py index d508257e..0b930665 100644 --- a/migen/genlib/cordic.py +++ b/migen/genlib/cordic.py @@ -285,10 +285,11 @@ class TwoQuadrantCordic(Module): return a, s, zmax, gain def _stage(self, xi, yi, zi, xo, yo, zo, i, ai): + dir = Signal() if self.cordic_mode == "rotate": - direction = zi < 0 + self.comb += dir.eq(zi < 0) else: # vector - direction = yi >= 0 + self.comb += dir.eq(yi >= 0) dx = yi>>i dy = xi>>i dz = ai @@ -296,15 +297,11 @@ class TwoQuadrantCordic(Module): dx = 0 elif self.func_mode == "hyperbolic": dx = -dx - stmt = If(direction, - xo.eq(xi + dx), - yo.eq(yi - dy), - zo.eq(zi + dz), - ).Else( - xo.eq(xi - dx), - yo.eq(yi + dy), - zo.eq(zi - dz), - ) + stmt = [ + xo.eq(xi + Mux(dir, dx, -dx)), + yo.eq(yi + Mux(dir, -dy, dy)), + zo.eq(zi + Mux(dir, dz, -dz)) + ] return stmt class Cordic(TwoQuadrantCordic):