Typical open-drain logic is described in (Xilinx Answer 6717). This open-drain logic can be written as follows:
my_od <= '0' when en = '0' else 'Z';
The Fitter report equation shows:
my_od = en;
This logic appears incorrect.
The CoolRunner-II CPLD supports open-drain outputs.
In an open-drain signal, when the logic is "true", the output is in high-impedance, and relies on an external pull-up resistor to raise the bus High. When the logic is "false", the output is driven Low to keep the external bus Low.
When a signal is configured as an open-drain output, the output logic is high-impedance when "true" and driven Low when "false."
Consequently, the following equation, when implemented as on an open-drain configuration, means that when the "en" signal is "true," the output is high-impedance. When "en" is "false," the output is driven Low.
my_od = en;
To determine if an output is configured as an open-drain signal, see the section of the Fitter report (.rpt) that is labeled "Resources Used by Successfully Mapped Logic" and locate the column labeled "I/O Style." If the output has "OD" in this column, then that output is configured as an open-drain signal and the equation must be interpreted accordingly.