Exploring trade-offs in buffer requirements and throughput constraints for synchronous dataflow graphs