Constraint Programming Techniques for Generating Efficient Hardware Architectures for Field Programmable Gate Arrays