FlexCNN: An End-to-End Framework for Composing CNN Accelerators on FPGA