A .ddl file is an ASCII text file that can be created using any text editor or by a custom program. It contains information formatted using the DDL specification to define a bond issue for a DBC programs -- including DBC Finance, DBC Debt Manager and DBC Housing. Each program has specific behavior; there are several features that require research, testing and documentation. However, this document will generally focus on the bond, reserve fund and expense information that can be imported and exported by DBC Finance in Debt/Size. DBC Debt Manager does not import/export any reserve fund or expense information.
The .ddl file must be formatted strictly according to the definitions below. Each group of data is always preceded by a line containing a keyword that clearly describes what is on the upcoming line(s). Each line that contains a keyword begins either with two slash characters (//) or two pound characters (##).
The order in which the data and keywords appear in a .ddl file is significant. Subsequent keywords can override the information contained in earlier parts of the .ddl file. Thus it is important to process a .ddl file completely from beginning to end.
Extra spaces at the beginning of each line are not significant. In the examples in this document, the data at deeper levels have been indented to make them clearer on the printed page. However, a program reading .ddl files cannot assume the presence or absence of leading spaces on any given line, while a program generating .ddl files can insert as many spaces at the beginning of any line as it sees fit.
Any line that begins with four slash characters //// signifies that it is a comment line and should be ignored when importing a .ddl file. Note that comments must span the entire line, so that a sequence of four slashes in the middle of a line does not mean that the remainder of the line is a comment.
Except for tables, every keyword occurs on a line by itself. Data associated with the keyword should be on the next line. Data (or anything else) that incorrectly follows the keyword can result in bad data. For tables, the keyword should be followed by a space and the number of rows in the table.
Note:
You may import one or more series from the same .ddl file.
If the issuer name and series name in the .ddl file corresponds to an existing issuer/series in the .df2 file, the series will be replaced with the information contained in the .ddl file. Any existing bond component, reserve fund or expense in the series with the same short name as a one in the .ddl file, will also be replaced.
To import a .ddl file into DBC Finance:
Unless otherwise indicated, all imported data is treated as protected data, as if entered by hand. Any assumed default values or settings are not protected.
To import a specific reserve fund deposit or expense amount, indicate the amount in the NLF.
You may update the bond data for only one series from a .ddl file. The .ddl file may contain data (including non-bond data) for multiple series.
If the issuer name and series name in the .ddl file corresponds to an existing issuer/series in the .df2 file, existing bonds with the same short name will be replaced with the information contained in the .ddl file. Existing bonds in the series with short names that do not appear in the .ddl file will remain in the series.
To import a .ddl file into DBC Finance:
Unless otherwise indicated, all imported data is treated as protected data, as if entered by hand. Any assumed default values or settings are not protected.
To import a specific reserve fund deposit or expense amount, indicate the amount in the NLF.
You may export one or more series from the same .df2 file.
To export multiple series to a single .ddl file from DBC Finance:
To export a currently open series (the status of the series is irrelevant):
You may import one or more series from the same .ddl file.
The import assumes any issuer/series (i.e. //Issuer and //Series) combination in the .ddl file does not exist in the database. Importing a .ddl file as a method for updating the database may produce expected results.
To import a .ddl file into DBC Debt Manager:
You may export one or more series from the same Issuing Authority to a single .ddl file.
To export series from DBC Debt Manager:
Revision number 2012.1, 10/25/2012
The first line in a .ddl file will always contain the keyword //$DDL followed by the DDL revision number. For example:
//$DDL 2012.1
At the top level, there are keywords available to define global parameters, to cause certain actions to occur and to initiate/end subgroups or tables. Each subgroup can have its own set of keywords to define parameters, cause actions, and even create subgroups or tables of its own. Therefore it is possible to have a recursive definition for subgroups.
The possible data types in a .ddl file are:
| "30/360" - 30/30 basis | "ACT/ACT" - ACT/ACT basis |
| "ACT/360" - ACT/360 basis | "ACT/365" - ACT/365 basis |
| "12" - annual | "-7" - weekly, note the dash |
| "6" - semiannual | "-14" - biweekly, note the dash |
| "3" - quarterly | "-28" - 28 days, note the dash |
| "2" - bimonthly | "-35" - 35 days, note the dash |
| "1" - monthly |
The following table describes the DDL syntax to create/update a series. The name/description and status correspond to the short/long name and status used to create issuers and series in DBC Finance. The dated/delivery date and interest payment information corresponds to data you would enter on the Debt/Size Assumptions screen.
Note: There is no shortcut to define information that carries over from one series definition to the next. For example, the first interest date should be stated for each series even if all series in the .ddl file should be saved under the same issuer.
| DDL Keyword (data) |
|
//NewSeries Indicates the start of series information. Everything after this line, up to the next //NewSeries line or the end of the file, is used to define a series |
|
//Issuer (string) The issuer name (short name) up to 8 characters using A - Z, 0 - 9 and the underscore character. |
|
//IssuerTitle (string) The issuer description (long name) up to 50 characters. |
|
//Series (string) The series name (short name) up to 8 characters using A - Z, 0 - 9 and the underscore character. |
|
//SeriesTitle (string) The series description (long name) up to 50 characters. |
|
//SeriesStatus (string) The series status. The currently supported statuses are:
|
|
//Dated (date) The dated date. |
|
//Deliv (date) The delivery date. |
|
//FirstInt (date) The first interest payment date. |
|
//IntFreq (number) The interest frequency. If //IntFreq is omitted, semiannual is assumed. DBC Debt Manager does not import this data but will use it as the default for bond components. DBC Debt Manager does not export this data. |
|
//Basis (basis) The interest day basis. If //Basis is omitted, 30/360 is assumed. DBC Debt Manager does not import this data but will use it as the default for bond components. DBC Debt Manager does not export this data. |
The following .ddl fragment represents the beginning of a series definition. //NewSeries, //Issuer, //IssuerTitle, //Series, //SeriesTitle, //SeriesStatus should be the first 6 keywords to define a series.
//NewSeries //Issuer "ABC" //IssuerTitle "ABC County" //Series "2010A" //SeriesTitle "Series 2010A" //SeriesStatus "Act" //Dated 01/01/2010 //Deliv 01/15/2010 //FirstInt 07/01/2010
The following table describes the DDL syntax to create/update a bond component. The dated/delivery date and interest payment information is optional and corresponds to data you would enter on the Bond Component screen. For the bond component, this information overrides the information on the Debt/Size Assumptions screen as it would if you manually entered the information.
Note: An existing bond component in the series (.df2 file) with the same name as the bond component in the .ddl file will be updated.
| DDL Keyword (data) |
|
//BeginBondDescription Indicates the beginning of a bond component subgroup. |
|
//EndBondDescription Indicates the end of a bond component subgroup. |
|
//Name (string) The bond component name (short name) up to 8 characters using A - Z, 0 - 9 and the underscore character. |
|
//Title (string) The bond component description up to 50 characters. |
|
//Options (string) One or more optional characteristics of the bond component:
Each option must be quoted. All options must appear on a single line separated by a comma. To denote a serial CAB bond, the options would be: "CAB","Serial" or"Serial","CAB" |
|
//Dated (date) The dated date. If omitted, the series information is assumed. In DBC Debt Manager, this field is not imported/exported. |
|
//Deliv (date) The delivery date. If omitted, the series information is assumed. In DBC Debt Manager, this field only applies to CABs and convertible CABs. |
|
//FirstInt (date) The first interest payment date. If omitted, the series information is assumed. In DBC Finance, this field does not apply to CABs and convertible CABs. In DBC Debt Manager, this field only applies to CABs and convertible CABs. |
|
//IntFreq (freq) The interest payment frequency. If //IntFreq is omitted, the series information or semiannual is assumed. |
|
//Basis (basis) The interest day basis. If //Basis is omitted, 30/360 is assumed. |
|
//MaturityDenom (number) For CABs or convertible CABS, the future value of the bond at maturity. In DBC Finance, if omitted, 5000 is assumed. In DBC Debt Manager, if omitted, 0 is assumed. |
|
//FinalCompoundingDate (date) For convertible CABS, the final compounding date for the bond. |
|
//BDA_int_only (bda) //BDA_pandi (bda) Any change to the interest payment date or principal and interest payment date (maturity date) if it falls on a non-business date (weekend or holiday).
If //BDA_int_only is omitted, no business day adjustment is assumed.
|
|
//BeginMaturityTable rows (table) Indicates the beginning of a bond maturity table and the number of rows in the table. Each entry (row) in the table must have 6 items of data separated by commas. The fixed columns, corresponding to the Maturity Structure tab, are:
Example: $90000 maturing on 1/1/2015, paying 5%, yielding 4.95%, sold at 101 with a $2 takedown would be defined as: 1/1/2015,90000,.05,.0495,101,2 Items may be left blank (e.g. yield, takedown), such as:
//// yield and takedown are blank
1/1/2015,90000,.05,,101,
The optional keywords are:
Multiple keywords and values must be separated by a space. To define the 1/1/2015 maturity with a $10000 denomination, variant name "AMT" and CUSIP name "XYZ": 1/1/2015,90000,.05,.0495,101,2 //Denom=10000 //Variant="AMT" //CUSIP="XYZ" |
|
//EndMaturityTable Indicates the end the bond maturity table. |
|
//BeginCallTable rows callable_dates lag (table) Begin definition of a table containing call dates/prices. After //BeginCallTable, specify:
Each entry in the table has 2 columns separated by a comma. The columns are:
|
|
//EndCallTable End the bond call table. |
//BeginBondDescription, //Name and //Title should be the first 3 keywords used to define a bond.
The following .ddl fragment can define a CAB term bond that is only callable on interest payment (compounding) dates. The values for dated date, delivery date and first interest payment (compounding date) will be defaulted from the series level.
/BeginBondDescription
//Name
"TERM25"
//Title
"2025 Term bonds"
//Options
"Term"
//BDA_int_only
"bda_accruednext"
//MaturityDenom
5000
//BeginMaturityTable 5
01/01/2026,11962,0.05,0.05,100,0 //Denom=1196.2
01/01/2027,11962,0.05,0.05,100,0 //Denom=1196.2
01/01/2028,11962,0.05,0.05,100,0 //Denom=1196.2
01/01/2029,11962,0.05,0.05,100,0 //Denom=1196.2
01/01/2030,11962,0.05,0.05,100,0 //Denom=1196.2
//EndMaturityTable
//BeginCallTable 3 int_only
01/01/2014,102
01/01/2015,101
01/01/2016,100
//EndCallTable
//EndBondDescription
Previous versions of DDL assumed all CABs compounded to $5,000. A CAB that compounded to $10,000 could not be defined. For example:
//// CAB assumed to compound to 5000 //Options "Serial","CAB"
Previous versions of DDL allowed convertible CABs specified with optional parameters.
//// convertible CAB compounds to 10000 on 1/1/2010 //Options "Serial","ConvCAB 01/01/2010 10000"
//// convertible CAB assumed to compound to 5000 on 1/1/2010 //Options "Serial","ConvCAB 01/01/2010"
//// convertible CAB assumed to compound to $5,000 on an unspecified date //Options "Serial","ConvCAB"
The current version of DDL allows the future value and/or final compounding date to be defined explicitly.
//// CAB compounds to 10000 //Options "Serial","CAB" //MaturityDenom 10000
//// convertible CAB compounds to 10000 on 1/1/2010 //Options "Serial","ConvCAB" //MaturityDenom 10000 //FinalCompoundingDate 01/01/2010
Blank items will be unprotected. The row must still contain 6 items. The 1/1/2021 maturity with no stated yield or takedown would be defined as:
1/1/2021,100000,.12,,100,
The order for protecting the rate, yield and price, whether blank or not, is:
In general, if the rate, price and yield are specified, the yield will be ignored, unprotected and calculated.
The following table describes the DDL syntax to create/update a debt service reserve fund or capitalized interest fund.
Note: An existing reserve fund in the series (.df2 file) with the same name as the reserve fund in the .ddl file will be updated.
If a calculation or solution was performed, the .ddl file will state the calculated reserve fund deposit or expense amount (as a use of funds).
| DDL Keyword (data) |
|
//BeginReserveDescription Indicates the beginning of a DSRF/CapI fund subgroup. |
|
//EndReserveDescription Indicates the end of a DSRF/CapI fund subgroup. |
|
//Name (string) The DSRF/CapI fund name (short name) up to 8 characters using A - Z, 0 - 9 and the underscore character. |
|
//Title (string) The DSRF/CapI fund description (long name) up to 50 characters. |
|
//Options (string) Indicate whether the reserve fund is a DSRF or CapI fund. This must come before the NLF. The choices are:
|
|
//Amount (number) After performing a calculation or solution involving the series, this amount indicates the deposit to the fund (as per Sources & Uses). The //Amount keyword is only used for exports. To import a specific amount use NLF. |
|
//BeginCalcMethod rows Indicates the beginning of a DSRF/CapI fund NLF and the number of rows in the formula. The //Options keyword should have previously indicated whether for NLF is a balance requirement or a draw requirement. Each row of NLF must appear on separate lines as if it would be entered manually in DBC Finance. |
|
//EndCalcMethod Indicates the end of the NLF. |
|
//Funding Indicates the funding option for the fund. The options are:
|
|
//Rate (number or string) Indicates the investment interest rate for the fund. A number indicates Investment Interest Rate is Specified percent. A string (i.e. "ARBYIELD") indicates Investment Interest Rate is Arbitrage yield. "Arbitrage yield" is a choice, the actual arbitrage yield is not imported or exported. |
|
//FirstInt (date) The first interest payment date for the fund. Does not apply to a net funded (PV) fund. |
|
//IntFreq (freq) The interest payment frequency for the fund. Does not apply to a net funded (PV) fund. If no frequency is indicated, semiannual is assumed. |
|
//Basis (basis) The interest day basis for the fund. Does not apply to a net funded (PV) fund. If //Basis is omitted, 30/360 is assumed. |
|
//ApplyDrawsToDS (string) Determines the state for Apply draws for debt service box:
|
|
|
//BeginReserveDescription, //Name, //Title and //Options should be the first 4 keywords used to define a reserve fund.
The following .ddl fragment can define a DSRF based on the 3 prong test. Note the NLF is not enclosed in quotes. The number of lines in the formula must be stated after //BeginCalcMethod. Any acceptable manually typed NLF shorthand (e.g. "ds" for "Debt Service") can also be used in the .ddl file.
//BeginReserveDescription //Name "DSRF" //Title "Debt Service Reserve Fund" // Options "DSRF" //Rate "ARBYIELD" //BeginCalcMethod 4 Lesser of 10% of Reasonable Par Amount Maximum annual Debt Service 125% of average annual adjusted Debt Service //EndCalcMethod //Funding "PV" //EndReserveDescription
The following table describes the DDL syntax to create/update an expense.
Note: An existing expense in the series (.df2 file) with the same name as the expense in the .ddl file will be updated.
The Type of Expense must be Other, using a different option may produce errors on import or export.
| DDL Keyword (data) |
|
//BeginExpenseDescription Indicates the beginning of an expense subgroup. |
|
//EndExpenseDescription Indicates the end of an expense subgroup. |
|
//Name (string) The expense name (short name) up to 8 characters using A - Z, 0 - 9 and the underscore character. |
|
//Title (string) The expense description (long name) up to 50 characters. |
|
//Type (string) The expense type corresponding to the simpler Type of Expense options on the Expense Description tab:
|
|
//Options (string) If an option appears, it indicates the corresponding box in the Expense Description tab is checked. The options are:
The options must be appear on a single line separated by a comma. When creating an expense in DBC Finance, the Include in All-In TIC box is checked by default. When importing a .ddl file, the above boxes (including Include in All-In TIC) are assumed to be not checked unless the option is used. In other words, when creating the expense manually in DBC Finance, Include in All-In TIC will be checked by default, but the import does not have the "ALLIN" option as a default. |
|
//Amount (number) After performing a calculation or solution involving the series, this amount indicates the expense (as per Sources & Uses). The Type of Expense must be Other. This is a calculated amount. If the expense is a fixed amount, use NLF. |
|
//BeginCalcMethod rows (NLF) Indicates the beginning of an expense NLF and the number of rows in the formula. Each row of NLF must appear on separate lines as if it would be entered manually. |
|
//EndCalcMethod Indicates the end of the NLF. |
// BeginExpenseDescription, //Name and //Title should be the first 3 keywords used to define an expense.
The following .ddl fragment can define a bond insurance expense. Note the NLF is not enclosed in quotes. The number of lines in the formula must be stated after //BeginCalcMethod. Any acceptable manually typed NLF shorthand (e.g. "ds" for "Debt Service") can also be used in the .ddl file
//BeginExpenseDescription //Name "INS" //Title "Bond Insurance" //Type "OTHER" //Options "ARB","ALLIN" //BeginCalcMethod 1 1.000% of Total adjusted Debt Service //EndCalcMethod //EndExpenseDescription