To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of CPUs to be made as `x` and the number of GPUs to be made as `y`. The objective is to maximize profit, which can be represented by the equation `300x + 500y`.

The constraints are based on the limited time available for wiring and soldering:
1. Wiring constraint: `30x + 90y ≤ 2000` (since each CPU requires 30 minutes of wiring and each GPU requires 90 minutes, and there are at most 2000 minutes available).
2. Soldering constraint: `50x + 40y ≤ 2500` (since each CPU requires 50 minutes of soldering and each GPU requires 40 minutes, and there are at most 2500 minutes available).

Additionally, `x` and `y` should be non-negative since the manufacturer cannot produce a negative number of CPUs or GPUs.

Here's how we can translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Hardware_Manufacturer")

# Define variables
x = m.addVar(vtype=GRB.INTEGER, name="CPUs")
y = m.addVar(vtype=GRB.INTEGER, name="GPUs")

# Set the objective function to maximize profit
m.setObjective(300*x + 500*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(30*x + 90*y <= 2000, "Wiring_Constraint")
m.addConstr(50*x + 40*y <= 2500, "Soldering_Constraint")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"CPUs to produce: {x.x}")
    print(f"GPUs to produce: {y.x}")
    print(f"Maximum profit: ${300*x.x + 500*y.x}")
else:
    print("No optimal solution found")
```