An efficient and complete approach for throughput-maximal SDF allocation and scheduling on multi-core platforms