A method of generating an integrated circuit design by first creating a circuit design which can carry out target applications and then adding new circuit elements which can carry out additional applications based on training data to optimize an objective function.