========= RENAME STRATEGY ========= Special chars ~!@#$%^*-_+=?/ get renamed to _XX, where XX is a hex representation of the symbol a_x => a_XXx a_XXx => a_XXXXx This guarantees all symbols use a subset of the character set Now, I need to rename duplicate symbols, so: wire x when p wire x => wire x%0 when p wire x%1 We know that all new symbols are unique because they use a special character At this point, all names are unique. -- Bundle Expansion -- To deal with bundle expansion, use another different special character: wire x : {a,b} => wire x#a wire x#b -- Vector Expansion -- To deal with bundle expansion, use another different special character: wire x : UInt<1>[3] => wire x$0 : UInt<1> wire x$1 : UInt<1> wire x$2 : UInt<1> -- Creating Temporaries -- To deal with creating temporaries, use another different special character: node x = a + b * c => node x!0 = b * c node x!1 = a + x!0 node x = x!1 Finally, to deal with backends that only use subsets of the special characters, do another rename step to remove special characters (must remove $ again!) ASCII Hex _ 5F __ ~ 7E _A ! 21 _B @ 40 _C # 23 _D $ 24 _E % 25 _F ^ 5E _G * 2A _H - 2D _I + 2B _J = 3D _K ? 3F _L / 2F _M