Placement and routing of Boolean functions in constrained FPGAs using a distributed genetic algorithm and local search