How does VTA runtime know which driver functions to call?

I’m working on adding a new FPGA device to VTA. In doing so, I need to write new driver functions for the runtime to talk to the FPGA device similar to functions in sim_driver.cc/pynq_driver.cc/de10nano_driver.cc and tsim_driver.cc.

I’m hoping this is a straight forward question. How does the VTA runtime know which device driver function to call into depending on the target (eg. target: “pynq”) specified in the vta_config.json file. For example, when the VTA runtime (runtime.cc) calls the function VTAMemCopyFromHost(), how does it know to call into the VTAMemCopyFromHost() function in sim_driver.cc/pynq_driver.cc/de10nano_driver.cc or tsim_driver.cc? The functions in these driver files all have the same function signature. I basically want to create a new driver.cc file for my FPGA device but I’m not sure how I can get the VTA runtime to call into it.