Skip to content

Commit 81519eb

Browse files
committed
Allow parsing multiple XDC files
Signed-off-by: Krzysztof Boronski <[email protected]>
1 parent 6662ede commit 81519eb

File tree

7 files changed

+45
-26
lines changed

7 files changed

+45
-26
lines changed

vpr/src/base/SetupVPR.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void SetupVPR(const t_options* Options,
9797
FileNameOpts->CmosTechFile = Options->CmosTechFile;
9898
FileNameOpts->out_file_prefix = Options->out_file_prefix;
9999
FileNameOpts->read_vpr_constraints_file = Options->read_vpr_constraints_file;
100-
FileNameOpts->read_xdc_constraints_file = Options->XDCFile;
100+
FileNameOpts->read_xdc_constraints_files = Options->XDCFiles;
101101
FileNameOpts->write_vpr_constraints_file = Options->write_vpr_constraints_file;
102102
FileNameOpts->write_block_usage = Options->write_block_usage;
103103

@@ -119,7 +119,7 @@ void SetupVPR(const t_options* Options,
119119
Arch,
120120
device_ctx.physical_tile_types,
121121
device_ctx.logical_block_types);
122-
VTR_ASSERT_MSG(Options->XDCFile.value() != "", "XDC constraints are not supported for VTR format");
122+
VTR_ASSERT_MSG(Options->XDCFiles.value().size() != 0, "XDC constraints are not supported for VTR format");
123123
break;
124124
case e_arch_format::FPGAInterchange:
125125
VTR_LOG("Use FPGA Interchange device\n");

vpr/src/base/read_options.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,8 +1517,10 @@ argparse::ArgumentParser create_arg_parser(std::string prog_name, t_options& arg
15171517
file_grp.add_argument(args.SDCFile, "--sdc_file")
15181518
.help("Path to timing constraints file in SDC format")
15191519
.show_in(argparse::ShowIn::HELP_ONLY);
1520-
1521-
file_grp.add_argument(args.XDCFile, "--xdc_file")
1520+
1521+
file_grp.add_argument(args.XDCFiles, "--xdc_files")
1522+
.nargs('+')
1523+
.default_value({})
15221524
.help("Path to Xilinx's Design Constraints file")
15231525
.show_in(argparse::ShowIn::HELP_ONLY);
15241526

vpr/src/base/read_options.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct t_options {
1919
argparse::ArgValue<std::string> PowerFile;
2020
argparse::ArgValue<std::string> CmosTechFile;
2121
argparse::ArgValue<std::string> SDCFile;
22-
argparse::ArgValue<std::string> XDCFile;
22+
argparse::ArgValue<std::vector<std::string>> XDCFiles;
2323

2424
argparse::ArgValue<e_arch_format> arch_format;
2525
argparse::ArgValue<e_circuit_format> circuit_format;

vpr/src/base/vpr_api.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ void vpr_initialize_logging() {
170170
* 4. Sanity check all three
171171
*/
172172
void vpr_init(const int argc, const char** argv, t_options* options, t_vpr_setup* vpr_setup, t_arch* arch) {
173-
174173
vpr_initialize_logging();
175174

176175
/* Print title message */
@@ -348,9 +347,9 @@ void vpr_init_with_options(const t_options* options, t_vpr_setup* vpr_setup, t_a
348347
auto& filename_opts = vpr_setup->FileNameOpts;
349348
if (!filename_opts.read_vpr_constraints_file.empty())
350349
load_vpr_constraints_file(filename_opts.read_vpr_constraints_file.c_str());
351-
if (!filename_opts.read_xdc_constraints_file.empty()) {
350+
if (filename_opts.read_xdc_constraints_files.size()) {
352351
try {
353-
load_xdc_constraints_file(filename_opts.read_xdc_constraints_file.c_str(), *arch, atom_ctx.nlist);
352+
load_xdc_constraints_files(filename_opts.read_xdc_constraints_files, *arch, atom_ctx.nlist);
354353
} catch (const TCL_eErroneousTCL& e) {
355354
vpr_throw(VPR_ERROR_XDC, e.filename.c_str(), e.line, e.message.c_str());
356355
} catch (const TCL_eException& e) {

vpr/src/base/vpr_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ struct t_file_name_opts {
721721
std::string CmosTechFile;
722722
std::string out_file_prefix;
723723
std::string read_vpr_constraints_file;
724-
std::string read_xdc_constraints_file;
724+
std::vector<std::string> read_xdc_constraints_files;
725725
std::string write_vpr_constraints_file;
726726
std::string write_block_usage;
727727
bool verify_file_digests;

vpr/src/base/xdc_constraints.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ REGISTER_TCL_TYPE_W_STR_UPDATE(AtomPortId)
243243
}
244244
END_REGISTER_TCL_TYPE;
245245

246-
VprConstraints read_xdc_constraints_to_vpr(std::istream& xdc_stream, const t_arch& arch, AtomNetlist& netlist) {
246+
VprConstraints read_xdc_constraints_to_vpr(std::vector<XDCStream>&& xdc_streams, const t_arch& arch, AtomNetlist& netlist) {
247247
VprConstraints constraints;
248248
TclPhysicalConstraintsClient pc_client(constraints, arch, netlist);
249249

@@ -269,25 +269,30 @@ VprConstraints read_xdc_constraints_to_vpr(std::istream& xdc_stream, const t_arc
269269
ctx.add_tcl_type<AtomPortId>();
270270
ctx.add_tcl_client<TclPhysicalConstraintsClient>(pc_client);
271271

272-
/* Read and interpret XDC */
273-
ctx.read_tcl(xdc_stream);
272+
/* Read and interpret XDCs */
273+
for (auto& stream : xdc_streams) {
274+
try {
275+
ctx.read_tcl(*stream.stream);
276+
} catch (TCL_eErroneousTCL& e) {
277+
e.filename = stream.name;
278+
throw e;
279+
}
280+
}
274281
});
275282

276283
/* At this point `pc_client` has written the contraints */
277284
return constraints;
278285
}
279286

280-
void load_xdc_constraints_file(const char* read_xdc_constraints_name, const t_arch& arch, AtomNetlist& netlist) {
281-
VTR_ASSERT(vtr::check_file_name_extension(read_xdc_constraints_name, ".xdc"));
282-
VTR_LOG("Reading XDC %s...\n", read_xdc_constraints_name);
287+
void load_xdc_constraints_files(const std::vector<std::string> xdc_paths, const t_arch& arch, AtomNetlist& netlist) {
288+
std::vector<XDCStream> xdc_streams;
289+
for (auto&& path : xdc_paths) {
290+
VTR_ASSERT(vtr::check_file_name_extension(path.c_str(), ".xdc"));
291+
VTR_LOG("Reading XDC %s...\n", path.c_str());
292+
auto file = std::unique_ptr<std::istream>(new std::ifstream(path));
293+
xdc_streams.push_back(XDCStream(std::move(path), std::move(file)));
294+
}
283295

284-
std::ifstream file(read_xdc_constraints_name);
285296
FloorplanningContext& floorplanning_ctx = g_vpr_ctx.mutable_floorplanning();
286-
287-
try {
288-
floorplanning_ctx.constraints = read_xdc_constraints_to_vpr(file, arch, netlist);
289-
} catch (TCL_eErroneousTCL& e) {
290-
e.filename = std::string(read_xdc_constraints_name);
291-
throw e;
292-
}
297+
floorplanning_ctx.constraints = read_xdc_constraints_to_vpr(std::move(xdc_streams), arch, netlist);
293298
}

vpr/src/base/xdc_constraints.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@
22
#define XDC_CONSTRAINTS_H
33

44
#include <string>
5+
#include <vector>
6+
#include <memory>
7+
#include <iostream>
58

69
#include "atom_netlist.h"
710
#include "physical_types.h"
811
#include "vpr_constraints.h"
912

13+
class XDCStream {
14+
public:
15+
inline XDCStream(std::string name_, std::unique_ptr<std::istream>&& stream_)
16+
: name(name_)
17+
, stream(std::move(stream_)) {}
18+
19+
std::string name;
20+
std::unique_ptr<std::istream> stream;
21+
};
22+
1023
/**
1124
* @brief Creates VprConstraints from input stream in XDC format.
1225
* @param xdc_stream XDC script
@@ -20,11 +33,11 @@
2033
*
2134
* This function may modify the netlist by changing its blocks' properties.
2235
*/
23-
VprConstraints read_xdc_constraints_to_vpr(std::istream& xdc_stream, const t_arch& arch, AtomNetlist& netlist);
36+
VprConstraints read_xdc_constraints_to_vpr(std::vector<XDCStream>& xdc_streams, const t_arch& arch, AtomNetlist& netlist);
2437

2538
/**
2639
* @brief Parse a file in XDC format and apply it to global FloorplanningContext.
27-
* @param read_xdc_constraints_name path to an XDC file with constraints
40+
* @param xdc_paths paths to XDC files with constraints
2841
* @param arch reference to loaded device architecture
2942
* @param netlist loaded AtomNetlist
3043
* @throws TCL_eException: base class for all exceptions
@@ -35,6 +48,6 @@ VprConstraints read_xdc_constraints_to_vpr(std::istream& xdc_stream, const t_arc
3548
* This function overwrites global floorplanning constraints (g_vpr.constraints_.constraints)\
3649
* This function may modify the netlist by changing its blocks' properties.
3750
*/
38-
void load_xdc_constraints_file(const char* read_xdc_constraints_name, const t_arch& arch, AtomNetlist& netlist);
51+
void load_xdc_constraints_files(const std::vector<std::string> xdc_paths, const t_arch& arch, AtomNetlist& netlist);
3952

4053
#endif

0 commit comments

Comments
 (0)